如何为SQL CLR存储过程提供sql_variant参数?

时间:2010-12-07 22:04:18

标签: c# sql sql-server stored-procedures sqlclr

如何将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
}

2 个答案:

答案 0 :(得分:3)

在SQL Books Online的Mapping CLR Parameter Data中,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

按预期运行并产生以下输出:

  hahahahaha

     

没有行影响。

     

(返回0行)

     

完成运行sp_executesql。

答案 1 :(得分:1)

分区边界值,如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(如前所述)映射到.NET中的object

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

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

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