C# 如何为sql CLR存储过程设置sql_变量参数?

C# 如何为sql CLR存储过程设置sql_变量参数?,c#,sql,sql-server,stored-procedures,sqlclr,C#,Sql,Sql Server,Stored Procedures,Sqlclr,如何将sql_变量参数添加到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_变量参数添加到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联机丛书”中,列为要用于映射的正确类型

我创建了一个简单的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


如文档所示,分区边界值可以是许多不同类型中的一种:

除text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、alias数据类型或CLR用户定义的数据类型外,所有数据类型都可以用作分区列

它们的实际数据类型存储在中

但如果从中选择它们,则
字段的类型为
SQL\u VARIANT
(显然是有充分理由的)

是的,
SQL\u VARIANT
(如前所述)映射到.NET中的
对象

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

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

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

我不确定你能不能。我所能找到的只是很多关于不同客户端API如何将它们转换为nvarchar或二进制列的参考资料。它必须是sql变体吗?@Damid_The_异教徒:是的,它确实需要是sql变体。我试图为任何给定分区传入边界值,该值在SQL中作为SQL_变量类型存在。分区的边界值严格来说不是SQL_变量(例如,它们不能接受文本类型的值)。我认为它们实际上在SQL中没有定义良好的类型。查看SMO函数中的分区函数,它们被视为对象,因此我认为没有更好的.NET类型适合它们。