如何为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_VARIANTSQL_VARIANT )映射到.NET中的object

如果需要检查NULL,请将对象与DBNull.Value进行比较。

如果您想知道对象中值的基础类型(很可能不是SQL_VARIANT / object ),请使用GetType()方法:

 if (aVariant.GetType() == typeof(SqlInt16))