2012-03-28 30 views
0

我的表:如何在sqlserver 2008中一次检查更多的列值?

id address tag 
1 test class1 
2 test1 class2 
3 test3 class3 

在UI我正在显示的所有标签名称为复选框。 当用户选择一个或多个标签名称时,则需要获取所需的地址值。如何获得? 如果用户在UI中选择class1,class2,则需要获得test,test1作为结果。 请告诉我如何在sqlserver 2008中编写查询。

编辑代码:

taglist = "class1,class2"; 
       SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["con"].ConnectionString); 
       SqlCommand cmd = new SqlCommand("usp_GetTags", con); 
       cmd.Parameters.Add("@Tags", SqlDbType.VarChar).Value = taglist; 

       con.Open(); 

       cmd.CommandType = CommandType.StoredProcedure; 
       SqlDataAdapter da = new SqlDataAdapter(cmd); 
       DataSet ds = new DataSet(); 
       da.Fill(ds); 

而传递参数如上述没有得到任何results.if我通过单个标记列表= Class1的越来越results.but标记表=“1类,等级2”没有得到任何resuls.please告诉我如何从UI传递多个参数。

回答

1

您可以使用IN关键字在sql server中编写查询。

Select address from mytable where tag IN ('class1','class2') 

编辑:

与值这样的存储过程添加的参数。下面的代码是用C#.NET

  comand.Parameters.AddWithValue("@Parameter1", "class1"); 
      comand.Parameters.AddWithValue("@Parameter2", "class2"); 

编辑2: 它放在一个单一字符串的所有值非常简单,因此查询也适合这一点。编写查询在存储过程像

  Select address from mytable where tag IN (@SingleParameter) 

,并在您的编码部分写像遵循

  string SingleParameter = ""; 
      SingleParameter = "class1,class2,class3"; 
      comand.Parameters.AddWithValue("@SingleParameter",SingleParameter); 

编辑3: 终于让我找到你的问题的解决方案。写存储过程如下

ALTER PROCEDURE dbo.TestSP 
    /* 
    (
    @parameter1 int = 5, 
    @parameter2 datatype OUTPUT 
    ) 
    */ 
    @SingleParameter varchar(30) 
AS 
    /* SET NOCOUNT ON */ 
    declare @tags varchar(500) 
    set @tags = @SingleParameter 
    create table #t (tag varchar(10)) 
    set @tags = 'insert #t select ' + replace(@tags, ',', ' union select ') 
    exec(@tags) 
     Select address from sample1 where (tag in (select tag from #t)) 
    drop table #t 
    RETURN 

,并发送参数SingleParameter如下

  string SingleParameter = ""; 
      SingleParameter = "'class1','class2','class3'"; 
      comand.Parameters.AddWithValue("@SingleParameter",SingleParameter); 
+0

我试过,但得到错误作为无效列名的Class1,Class2中。 – user1237131 2012-03-28 11:47:02

+0

@ user1237131,class1和class2不是列右侧,它们是标记列中的值。 – 2012-03-28 11:49:17

+0

S它们是标记列中的列值。我尝试使用上面的语法,但是将错误列为“无效列名称'class1'”,就像那样 – user1237131 2012-03-28 11:51:36