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