1

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

在它提到的文档中:

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

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

谢谢!

4

3 回答 3

6

从技术上讲,从 SQL Server 到 CLR 代码的接口中没有 8000 字节的最大值。主要是 T-SQL 包装器 Stored Proc 或 Function 的定义方式不同。意思是,如果调用 CLR 代码的 T-SQL Proc 或 Function 定义RETURNS为,那么无论您是否指定或作为 CLR 代码的返回类型,VARBINARY(MAX)它都应为。VARBINARY(MAX)SqlBytesSqlBinary

两者都SqlBytes可以SqlBinary处理 2 GB 的限制,但区别在于 CLR 代码如何接受数据。SqlBinary(就像SqlString)一次获取所有参数值,而SqlBytes(就像SqlChars)提供一个流接口,因此对于非常大的值可能更有效。

回到您在使用预定义 SQL 函数包装器时看到的问题,即是关于 Visual Studio(技术上是 SSDT)如何自动生成的问题sd 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. 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):

    [return: SqlFacet(MaxSize = -1)]  
    [Microsoft.SqlServer.Server.SqlFunction(Name = "FunctionName")]  
    public static SqlBinary FuncName([SqlFacet(MaxSize = 50)] SqlString InputParam)
    

Using either of these two methods you can make either SqlBinary or SqlBytes map to either VARBINARY(1 - 8000) or VARBINARY(MAX). Likewise, you can make either SqlString or SqlChars map to eithert NVARCHAR(1 - 4000) or NVARCHAR(MAX).

于 2011-01-21T22:41:34.803 回答
2

如果将其定义为返回SqlBytes数据类型,则它应该正确映射到varbinary(MAX)SQL Server 中。

[SqlFunction]
public static SqlBytes Function1()
{
    return new SqlBytes(Encoding.UTF8.GetBytes("Hello world."));
}

虽然您也可以使用SqlBinary数据类型,但如果您通过 Visual Studio 部署,它将被映射到varbinary(8000)而不是varbinary(MAX).

于 2009-05-08T17:02:22.663 回答
0

答案似乎是肯定的 - 您可以通过返回“SqlBinary”来同时使用 varbinary(MAX),也可以按照上面的建议使用 SqlBytes。

于 2009-05-08T18:51:01.513 回答