2014-09-29 61 views
1

部分與參數下面的SQL查詢工作:SQL服務器:參數未評估在和第

select A from B where C = @param1; 

C#:

command.Parameters.AddWithValue("@param1", "TEXT"); 

注:C是字符串類型的列

帶參數的以下SQL查詢不起作用:

select A from B where C = @param1 and D in (@param2); 

C#:

command.Parameters.AddWithValue("@param1", "123,234,456"); 

注:Dint

+0

您的意思是'command.Parameters.AddWithValue(「@ param2」,「123,234,456」);'? – 2014-09-29 10:58:59

+2

以錯誤的方式使用參數 – Reniuz 2014-09-29 11:01:52

+0

'IN(...)'需要**值列表** - 而您提供的只是一個**單個字符串** .... – 2014-09-29 11:03:39

回答

0

請參閱下面的鏈接,他們也傳遞數組到SQL IN條款

var parameters = new string[items.Length]; 
var cmd = new SqlCommand(); 
for (int i = 0; i < items.Length; i++) 
{ 
    parameters[i] = string.Format("@Age{0}", i); 
    cmd.Parameters.AddWithValue(parameters[i], items[i]); 
} 

cmd.CommandText = string.Format("SELECT * from TableA WHERE Age IN ({0})", string.Join(", ", parameters)); 
cmd.Connection = new SqlConnection(connStr); 

詳情請參閱:Pass Array Parameter in SqlCommand通過@布賴恩

4

的列,因爲你不能參數的in像;您當前正在請求一個in的單個值,它恰好是一個帶有逗號的字符串 - 也就是說,只有在D等於123,234,456的行中才有效。

您需要要麼有一個參數每值

... and D in (@param2, @param3, @param4) 

,或者使用的工具,這是否適合你。例如, 「短小精悍」:

string c = "TEXT"; 
int[] vals = { 123, 234, 456 }; 
var data = conn.Query<AType>("select A from B where C = @c and D in @vals", 
     new { c, vals }).ToList(); 
0

回答它確實有效。它只是不符合你的期望。表達:

D in (@param2) 

真的做得:

D = (@param2) 

因爲名單隻包含一個元素。它是一個包含逗號的元素,但它仍然只有一個字符串。解決此

一種方法是列出明確的參數:

D in (@in1, @in2, @in3, @in4) 

或者使用效率較低的方法,如like

',' + @param2 + ',' like '%,' + D + ',%' 

注:這假定D是一個字符串類型。如果是數字,則需要將其轉換爲字符類型。