CLR UDF返回Varbinary(MAX)

时间:2009-05-08 16:01:01

标签: sql-server sqlclr user-defined-functions

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

在它提到的文档中:

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

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

谢谢!

3 个答案:

答案 0 :(得分:6)

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

SqlBytesSqlBinary都可以处理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,那么您将需要使用以下方法之一覆盖默认值:

  1. 在Visual Studio生成函数或Proc定义后,您可以ALTER,在这种情况下,您甚至可以将数据类型(输入参数或返回值)更改为任何大小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)
    
  3. 使用这两种方法中的任何一种,您都可以将SqlBinarySqlBytes映射到VARBINARY(1 - 8000)VARBINARY(MAX)。同样,您可以将SqlStringSqlChars映射到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。