如何为SQL CLR存储过程提供sql_variant参数?
如何将sql_variant参数添加到SQL CLR存储过程? 使用System.Object不起作用,我没有看到任何可以使用的属性。
[Microsoft.SqlServer.Server.SqlProcedure] public static void ClearOnePartition( SqlString aString , /* I want this to be a sql_variant */ object aVariant ) { //do stuff here }
在SQL Books Online中映射CLR参数数据时 , Object被列为用于映射sql_variant的正确类型。
我创建了一个简单的SQL Server项目并向其添加了以下类:
public partial class StoredProcedures { [Microsoft.SqlServer.Server.SqlProcedure] public static void StoredProcedure1(object param1) { // Put your code here //Trace.Write(param1); SqlContext.Pipe.Send(param1.ToString()); } };
然后我修改了test.sql文件来运行这个存储过程:
DECLARE @thing sql_variant = 'hahahahaha'; EXEC dbo.StoredProcedure1 @thing
这按预期运行并产生以下输出:
哈哈哈哈哈
没有行影响。
(已返回0行)
完成运行sp_executesql。
分区边界值,如CREATE PARTITION FUNCTION文档中所示,可以是许多不同类型之一:
除text,ntext,image,xml,timestamp,varchar(max),nvarchar(max),varbinary(max),别名数据类型或CLR用户定义的数据类型外,所有数据类型都可用作分区列。
它们的实际数据类型存储在sys.partition_parameters中 。
但是如果从sys.partition_range_values中选择它们,那么value
字段的类型为SQL_VARIANT
(显然有充分理由)。
是的, SQL_VARIANT
( SQL_VARIANT
)映射到.NET中的object
。
如果需要检查NULL,请将对象与DBNull.Value
进行比较。
如果您想知道对象中值的基础类型(很可能不是SQL_VARIANT
/ object
),请使用GetType()
方法:
if (aVariant.GetType() == typeof(SqlInt16))