CLR UDF 返回 Varbinary(MAX)
SQL CLR 用户定义函数是否可以返回数据类型 varbinary(MAX)?
在文档中提到:
“标量值函数返回的输入参数和类型可以是 SQL Server 支持的任何标量数据类型,除了 rowversion、text、ntext、image、timestamp、table 或cursor。” - 他们没有提到 varbinary,但我不确定...
我有一些来自 .NET 端的字节数组数据,我需要从 CLR 返回到 SQL Server,并且我试图避免必须使用存储过程中的输出参数来执行此操作(这就是我现在在测试中使用它的方式)。
谢谢!
Is it possible for a SQL CLR User-Defined Function to return the data type varbinary(MAX)?
In the documentation it mentions:
"The input parameters and the type returned from a scalar-valued function can be any of the scalar data types supported by SQL Server, except rowversion, text, ntext, image, timestamp, table, or cursor." - they don't mention varbinary, but I'm not sure...
I have some byte-array data from the .NET side that I need to return to SQL Server from the CLR, and I'm trying to avoid having to do it with an output parameter from a stored procedure (this is how I have it working in test now).
Thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
从技术上讲,从 SQL Server 到 CLR 代码的接口不存在最大 8000 字节的限制。 主要是 T-SQL 包装器存储过程或函数的定义方式不同。 意思是,如果调用 CLR 代码的 T-SQL 过程或函数将
RETURNS
定义为VARBINARY(MAX)
,那么它应为VARBINARY(MAX)< /code>,无论您是否指定
SqlBytes
或SqlBinary
作为 CLR 代码的返回类型。SqlBytes
和SqlBinary
都可以处理 2 GB 限制,但区别在于 CLR 代码接受数据的方式。SqlBinary
(就像SqlString
)一次获取所有参数值,而SqlBytes
(就像SqlChars
)提供一个流接口,因此对于非常大的值可能会更有效。回到您在预定义 SQL 函数包装器中看到的问题,
是 Visual Studio(技术上是 SSDT)如何自动生成s的问题T-SQL。SqlBinary
is的默认值是VARBINARY(8000)
,而SqlBytes
is的默认值是 > 是VARBINARY(MAX)
。 同样,SqlString
is的默认值是NVARCHAR(4000)
,而SqlChars
的默认值是为NVARCHAR(4000)
。 >isNVARCHAR(MAX)
。 当提出这个问题时,这些是默认值。 也许从 Visual Studio 2012 开始,默认值更改为对所有 4 个数据类型使用 MAX。 这不一定是一件好事,因为使用MAX
类型与非MAX
类型相比,会明显影响性能。 因此,如果您不需要超过 8000 字节的VARBINARY
或 4000 字节的NVARCHAR
,那么您将需要使用以下方法之一覆盖默认值:VARBINARY(100)
或NVARCHAR(50)
。您可以使用
SqlFacet
装饰器告诉 Visual Studio / SSDT 使用您喜欢的大小选项(而不是默认值)自动生成 Function 或 Proc 定义。 以下示例显示指定输入参数和返回值的大小(请注意-1
=MAX
):使用这两种方法中的任何一种,您都可以创建
SqlBinary
或SqlBytes
映射到VARBINARY(1 - 8000)
或VARBINARY(MAX)
。 同样,您可以将SqlString
或SqlChars
映射到NVARCHAR(1 - 4000)
或NVARCHAR(MAX)
>。Technically there is no 8000 byte maximum in the interface from SQL Server to CLR code. It is mainly a difference of how the T-SQL wrapper Stored Proc or Function is defined. Meaning, if the T-SQL Proc or Function that calls the CLR code defines the
RETURNS
asVARBINARY(MAX)
, then it shall beVARBINARY(MAX)
, whether or not you specifiedSqlBytes
orSqlBinary
as the return type of the CLR code.Both
SqlBytes
andSqlBinary
can handle the 2 GB limit, BUT the difference is in how the CLR code accepts the data.SqlBinary
(just likeSqlString
) takes the parameter value all at once whileSqlBytes
(just likeSqlChars
) provides a streaming interface so it might be more efficient for very large values.Going back to the issue that you are seeing with the pre-defined SQL Function wrapper, that
iswas a matter of how Visual Studio (technically SSDT) auto-generatesd the T-SQL. The default forSqlBinary
iswasVARBINARY(8000)
while the default forSqlBytes
iswasVARBINARY(MAX)
. In the same manner, the default forSqlString
iswasNVARCHAR(4000)
while the default forSqlChars
iswasNVARCHAR(MAX)
. Those were the defaults when this question was asked. Starting in perhaps Visual Studio 2012, the default was changed to useMAX
for all 4 of these datatypes. This is not necessarily a good thing since there is a definite performance hit for using theMAX
types vs the non-MAX
types. So, if you don't need more than 8000 bytes ofVARBINARY
or 4000 bytes ofNVARCHAR
, then you will want to override the default using one of the following methods:You can
ALTER
the Function or Proc definition after it is generated by Visual Studio, and in this case you can even change the datatypes (of either input parameters or return values) to be any size such asVARBINARY(100)
orNVARCHAR(50)
.You can use the
SqlFacet
decorator to tell Visual Studio / SSDT to auto-generate the Function or Proc definitions with the size option that you prefer as opposed to the default. The following example shows specifying the size for both input parameters and the return value (note that-1
=MAX
):Using either of these two methods you can make either
SqlBinary
orSqlBytes
map to eitherVARBINARY(1 - 8000)
orVARBINARY(MAX)
. Likewise, you can make eitherSqlString
orSqlChars
map to eithertNVARCHAR(1 - 4000)
orNVARCHAR(MAX)
.如果将其定义为返回 SqlBytes数据类型,这应该正确映射到 SQL Server 中的
varbinary(MAX)
。同时您还可以使用 SqlBinary 数据类型,如果通过 Visual Studio 部署,它将映射到
varbinary(8000)
而不是varbinary(MAX)
。If you define it as returning a SqlBytes data type, this should correctly map to
varbinary(MAX)
in SQL Server.Whilst you can also use the SqlBinary data type, if you deploy via Visual Studio, it will be mapped onto
varbinary(8000)
rather thanvarbinary(MAX)
.看来答案是肯定的 - 您可以通过返回“SqlBinary”来使用 varbinary(MAX),也可以按照上面的建议使用 SqlBytes。
It appears that the answer is yes - you can use both varbinary(MAX) by returning "SqlBinary" or you can use SqlBytes as recommended above.