CLR UDF 返回 Varbinary(MAX)

发布于 2024-07-20 07:00:55 字数 318 浏览 4 评论 0原文

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

伴我老 2024-07-27 07:00:55

从技术上讲,从 SQL Server 到 CLR 代码的接口不存在最大 8000 字节的限制。 主要是 T-SQL 包装器存储过程或函数的定义方式不同。 意思是,如果调用 CLR 代码的 T-SQL 过程或函数将 RETURNS 定义为 VARBINARY(MAX),那么它应为 VARBINARY(MAX)< /code>,无论您是否指定 SqlBytesSqlBinary 作为 CLR 代码的返回类型。

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

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

  2. 您可以使用 SqlFacet 装饰器告诉 Visual Studio / SSDT 使用您喜欢的大小选项(而不是默认值)自动生成 Function 或 Proc 定义。 以下示例显示指定输入参数和返回值的大小(请注意 -1 = MAX):

    [返回:SqlFacet(MaxSize = -1)]   
      [Microsoft.SqlServer.Server.SqlFunction(名称 = "FunctionName")]   
      公共静态 SqlBinary FuncName([SqlFacet(MaxSize = 50)] SqlString InputParam) 
      

使用这两种方法中的任何一种,您都可以创建 SqlBinarySqlBytes 映射到 VARBINARY(1 - 8000)VARBINARY(MAX)。 同样,您可以将 SqlStringSqlChars 映射到 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 as VARBINARY(MAX), then it shall be VARBINARY(MAX), whether or not you specified SqlBytes or SqlBinary as the return type of the CLR code.

Both SqlBytes and SqlBinary can handle the 2 GB limit, BUT the difference is in how the CLR code accepts the data. SqlBinary (just like SqlString) takes the parameter value all at once while SqlBytes (just like SqlChars) 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 is was a matter of how Visual Studio (technically SSDT) auto-generatesd the T-SQL. The default for SqlBinary is was VARBINARY(8000) while the default for SqlBytes is was VARBINARY(MAX). In the same manner, the default for SqlString is was NVARCHAR(4000) while the default for SqlChars is was NVARCHAR(MAX). Those were the defaults when this question was asked. Starting in perhaps Visual Studio 2012, the default was changed to use MAX for all 4 of these datatypes. This is not necessarily a good thing since there is a definite performance hit for using the MAX types vs the non-MAX types. So, if you don't need more than 8000 bytes of VARBINARY or 4000 bytes of NVARCHAR, then you will want to override the default using one of the following methods:

  1. 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 as VARBINARY(100) or 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).

喜你已久 2024-07-27 07:00:55

如果将其定义为返回 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)

If you define it as returning a SqlBytes data type, this should correctly map to varbinary(MAX) in SQL Server.

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

Whilst you can also use the SqlBinary data type, if you deploy via Visual Studio, it will be mapped onto varbinary(8000) rather than varbinary(MAX).

野鹿林 2024-07-27 07:00:55

看来答案是肯定的 - 您可以通过返回“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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文