SQL CLR用户定义函数是否可以返回数据类型varbinary(MAX)?
在它提到的文档中:
“从标量值函数返回的输入参数和类型可以是SQL Server支持的任何标量数据类型,但rowversion,text,ntext,image,timestamp,table或cursor除外。” - 他们没有提到varbinary,但我不确定......
我有一些来自.NET端的字节数组数据,我需要从CLR返回到SQL Server,并且我试图避免必须使用存储过程的输出参数(这是如何我现在正在测试它。)
谢谢!
答案 0 :(得分:6)
从技术上讲,从SQL Server到CLR代码的接口中没有最大8000字节。它主要是T-SQL包装器存储过程或函数定义的不同之处。这意味着,如果调用CLR代码的T-SQL Proc或Function将RETURNS
定义为VARBINARY(MAX)
,那么它应为VARBINARY(MAX)
,无论您是否指定SqlBytes
或SqlBinary
作为CLR代码的返回类型。
SqlBytes
和SqlBinary
都可以处理2 GB的限制,但区别在于CLR代码如何接受数据。 SqlBinary
(就像SqlString
)一次获取参数值,而SqlBytes
(就像SqlChars
)提供了一个流接口,因此对于非常大的值可能更有效
回到您使用预定义的SQL函数包装器看到的问题,是是Visual Studio(技术上是SSDT)如何自动生成 s的问题 d T-SQL。 SqlBinary
的默认值为VARBINARY(8000)
,而SqlBytes
的默认值为为VARBINARY(MAX)
。以同样的方式,SqlString
的默认值为NVARCHAR(4000)
,而SqlChars
的默认值为为NVARCHAR(MAX)
。当问到这个问题时,那些是的默认值。从Visual Studio 2012开始,默认值已更改为对所有这4种数据类型使用MAX
。这不一定是件好事,因为使用MAX
类型和非MAX
类型会有明显的性能影响。因此,如果您不需要超过8000个字节的VARBINARY
或4000个字节的NVARCHAR
,那么您将需要使用以下方法之一覆盖默认值:
在Visual Studio生成函数或Proc定义后,您可以ALTER
,在这种情况下,您甚至可以将数据类型(输入参数或返回值)更改为任何大小VARBINARY(100)
或NVARCHAR(50)
。
您可以使用SqlFacet
装饰器告诉Visual Studio / SSDT使用您喜欢的大小选项自动生成Function或Proc定义,而不是默认选项。以下示例显示了指定输入参数和返回值的大小(请注意-1
= MAX
):
[return: SqlFacet(MaxSize = -1)]
[Microsoft.SqlServer.Server.SqlFunction(Name = "FunctionName")]
public static SqlBinary FuncName([SqlFacet(MaxSize = 50)] SqlString InputParam)
使用这两种方法中的任何一种,您都可以将SqlBinary
或SqlBytes
映射到VARBINARY(1 - 8000)
或VARBINARY(MAX)
。同样,您可以将SqlString
或SqlChars
映射到eithert NVARCHAR(1 - 4000)
或NVARCHAR(MAX)
。
答案 1 :(得分:2)
如果将其定义为返回SqlBytes数据类型,则应正确映射到SQL Server中的varbinary(MAX)
。
[SqlFunction]
public static SqlBytes Function1()
{
return new SqlBytes(Encoding.UTF8.GetBytes("Hello world."));
}
虽然您也可以使用SqlBinary数据类型,但如果您通过Visual Studio进行部署,则会将其映射到varbinary(8000)
而不是varbinary(MAX)
。
答案 2 :(得分:0)
似乎答案是肯定的 - 您可以通过返回“SqlBinary”来使用varbinary(MAX),也可以按照上面的建议使用SqlBytes。