从技术上讲,从 SQL Server 到 CLR 代码的接口中没有 8000 字节的最大值。主要是 T-SQL 包装器 Stored Proc 或 Function 的定义方式不同。意思是,如果调用 CLR 代码的 T-SQL Proc 或 Function 定义RETURNS
为,那么无论您是否指定或作为 CLR 代码的返回类型,VARBINARY(MAX)
它都应为。VARBINARY(MAX)
SqlBytes
SqlBinary
两者都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
,那么您将需要使用以下方法之一覆盖默认值:
您可以ALTER
在 Visual Studio 生成 Function 或 Proc 后定义,在这种情况下,您甚至可以将数据类型(输入参数或返回值)更改为任何大小,例如VARBINARY(100)
或NVARCHAR(50)
.
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)
.