CLR UDF返回Varbinary(MAX)

Sam*_*tte 1 sql-server sqlclr user-defined-functions

SQL CLR用户定义函数是否可以返回数据类型varbinary(MAX)?

在文档中提到:

"输入参数和从标量值函数返回的类型可以是SQL Server支持的任何标量数据类型,除了rowversion,text,ntext,image,timestamp,table或cursor." - 他们没有提到varbinary,但我不确定......

我有一些来自.NET端的字节数组数据,我需要从CLR返回到SQL Server,我试图避免必须使用存储过程的输出参数(这是我如何拥有它)现在在测试中工作).

谢谢!

Sol*_*zky 6

从技术上讲,从SQL Server到CLR代码的接口中最多没有8000字节.它主要是T-SQL包装器存储过程或函数定义的不同之处.这意味着,如果调用CLR代码的T-SQL Proc或Function定义了RETURNSas VARBINARY(MAX),那么它应该是VARBINARY(MAX),无论你是否指定SqlBytesSqlBinary作为CLR代码的返回类型.

双方SqlBytesSqlBinary可以处理2 GB的限制,但不同的是在CLR代码是如何接受数据.SqlBinary(就像SqlString)一次获取参数值,而SqlBytes(就像SqlChars)提供流接口,因此对于非常大的值可能更有效.

回到您使用预定义的SQL函数包装器看到的问题,即 是一个关于Visual Studio(技术上是SSDT)如何自动生成的问题小号d T-SQL.默认值为SqlBinary VARBINARY(8000)默认值SqlBytes 是的VARBINARY(MAX).以同样的方式,默认为SqlString NVARCHAR(4000)默认值SqlChars 是的NVARCHAR(MAX).当问到这个问题时,那些默认值.从Visual Studio 2012开始,默认值已更改为MAX用于所有这4种数据类型.这不一定是好事,因为使用MAX类型与非MAX类型有明显的性能影响.因此,如果您不需要超过8000个字节VARBINARY或4000个字节NVARCHAR,那么您将需要使用以下方法之一覆盖默认值:

  1. 您可以ALTER在Visual Studio生成后使用Function或Proc定义,在这种情况下,您甚至可以将数据类型(输入参数或返回值)更改为任何大小,例如VARBINARY(100)NVARCHAR(50).

  2. 您可以使用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)
    
    Run Code Online (Sandbox Code Playgroud)

使用这两种方法中的任何一种,您都可以制作SqlBinarySqlBytes映射到VARBINARY(1 - 8000)VARBINARY(MAX).同样,您可以制作SqlStringSqlChars映射到eithert NVARCHAR(1 - 4000)NVARCHAR(MAX).