2010-12-07 73 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))