2014-09-29 62 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是一个字符串类型。如果是数字,则需要将其转换为字符类型。