2012-12-04 33 views
0

很多時候我們在項目中傳遞一個從UI到存儲過程的ID列表。大多數解決方案都基於創建SQL字符串拆分函數來創建臨時表並使用臨時表執行某些內部聯接器。 E.T.CLR SQL用戶定義類型傳遞給存儲過程的ID列表

沒有任何一個在創造CLR SQL UDT一些StringList的經驗,我們可以傳遞給用戶PROC

StringList stringList = new StringList(); 
stringList.Add("ID1"); 
stringList.Add("ID2"); 
stringList.Add("ID3"); 
SqlCommand cmd = new SqlCommand("SelectDataByIDs"); 
cmd.Parameters.Add(new SqlParameter("list", SqlDbType.Udt){ Value = stringList}); 

,並在SQL

使用
SELECT * FROM DataTable 
WEHRE DataId in @stringList -- or inner join? 

請分享你的智慧

+0

另一種方法http://stackoverflow.com/questions/11102358/how-to-pass-an-array-into-a-sql-server-stored-procedure我喜歡TVP答案 – Paparazzi

+0

同意 - TVP是方式如果你使用的是SQL 2008或更高版本,那就去吧。 –

回答

1

這是我爲我的情況所做的:

--declare type 
CREATE TYPE StringIDList AS TABLE 
( StringId NVARCHAR(8) NOT NULL PRIMARY KEY) 
go 
--test function 
CERATE PROCEDURE SelectListValue 
( @ids [dbo].[StringIDList] readonly) 
AS 
BEGIN 
    SELECT * FROM @ids WHERE StringId <> '30' 
END 

C#代碼

SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS2012;Initial 
Catalog=db;Integrated Security=true"); 
conn.Open(); 

List<SqlDataRecord> records = new List<SqlDataRecord>(); 
var rec = new SqlDataRecord(new SqlMetaData("stringid", SqlDbType.NVarChar, 8)); 
rec.SetValue(0, "10"); 
records.Add(rec); 

rec = new SqlDataRecord(new SqlMetaData("stringid", SqlDbType.NVarChar, 8)); 
rec.SetValue(0, "30"); 
records.Add(rec); 

var cmd = new SqlCommand("SelectListValue"); 
cmd.CommandType = CommandType.StoredProcedure; 
cmd.Connection = conn; 

var param = new SqlParameter("@ids", SqlDbType.Structured); 
param.Direction = ParameterDirection.Input; 
param.TypeName = "StringIDList"; 
param.Value = records; 

cmd.Parameters.Add(param); 

var reader = cmd.ExecuteReader(); 
while (reader.Read()) 
{ 
    Console.WriteLine(reader.GetString(0)); 
} 

控制檯outup

10 

看起來很簡單的......你覺得呢?

+1

偉大的答案!謝謝 –

相關問題