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,我试图避免必须使用存储过程的输出参数(这是我如何拥有它)现在在测试中工作).
谢谢!
从技术上讲,从SQL Server到CLR代码的接口中最多没有8000字节.它主要是T-SQL包装器存储过程或函数定义的不同之处.这意味着,如果调用CLR代码的T-SQL Proc或Function定义了RETURNSas VARBINARY(MAX),那么它应该是VARBINARY(MAX),无论你是否指定SqlBytes或SqlBinary作为CLR代码的返回类型.
双方SqlBytes并SqlBinary可以处理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,那么您将需要使用以下方法之一覆盖默认值:
您可以ALTER在Visual Studio生成后使用Function或Proc定义,在这种情况下,您甚至可以将数据类型(输入参数或返回值)更改为任何大小,例如VARBINARY(100)或NVARCHAR(50).
您可以使用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)使用这两种方法中的任何一种,您都可以制作SqlBinary或SqlBytes映射到VARBINARY(1 - 8000)或VARBINARY(MAX).同样,您可以制作SqlString或SqlChars映射到eithert NVARCHAR(1 - 4000)或NVARCHAR(MAX).
| 归档时间: |
|
| 查看次数: |
5962 次 |
| 最近记录: |