2010-12-07 85 views
5

如何将sql_variant参数添加到SQL CLR存储过程?使用System.Object不起作用,并且我看不到任何可以使用的属性。如何为SQL CLR存储过程创建sql_variant参数?

[Microsoft.SqlServer.Server.SqlProcedure] 
public static void ClearOnePartition(
    SqlString aString 
    , /* I want this to be a sql_variant */ object aVariant 
) 
{ 
    //do stuff here 
} 
+1

我不知道你能够。我能找到的很多关于不同客户端API如何将它们转换成nvarchar或二进制列。它是否必须是sql_variant? – 2010-12-08 07:51:57

回答

3

Mapping CLR Parameter Data从SQL联机丛书,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 

此作为运行预计并产生以下输出:

haha​​hahaha

没有行受到影响。

(0行(多个)返回)

完成运行sp_executesql的。

1

分区边界值,作为CREATE PARTITION FUNCTION文档中示出,可以是多种不同类型中的一种:

所有数据类型是有效的用作分区列,除了文字,NTEXT,图像,XML ,时间戳,varchar(max),nvarchar(max),varbinary(max),别名数据类型或CLR用户定义的数据类型。

而他们的实际数据类型存储在sys.partition_parameters

但是,如果从sys.partition_range_values中选择它们,那么value字段的类型为SQL_VARIANT(显然有很好的理由)。

是的,SQL_VARIANT(如前所述)映射到.NET中的object

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

如果你想知道在对象的基本类型值(最有可能是不会被SQL_VARIANT/object),使用GetType()方法:

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