ASP.net简单删除查询,传入字符串值

时间:2011-03-10 12:04:21

标签: asp.net sql data-access-layer tableadapter

DELETE FROM tblArtworkApprovalUsers
WHERE     (userID NOT IN (@UserIDList)) AND (approvalID =
                          (SELECT     ID
                            FROM          tblArtworkApprovals
                            WHERE      (templateID = @TemplateID)))

这是在我的表适配器中。 @UserIDList需要接受类似的内容:

2,44,12,70

如何让此查询接受该字符串?

3 个答案:

答案 0 :(得分:2)

NOT IN <expr>需要表达式而不是字符串。因此,如果您传递参数而不是动态构造SQL,则无法完成。

替代方法是动态创建SQL(,同时了解SQL注入):

string commad = @"DELETE FROM tblArtworkApprovalUsers " +
             "WHERE (userID NOT IN ({0})) AND (approvalID ="+
                          "(SELECT     ID " +
                            "FROM          tblArtworkApprovals " +
                            "WHERE      (templateID = {1})))";

command = string.Format(command, userIDList, templateID);

更新

Craig指出了一个更好的解决方案,其中没有提供更好的性能(因为参数是可变的,并且查询计划不会被缓存,除非它完全相同)但是有助于SQL注入攻击Parameterize an SQL IN clause

答案 1 :(得分:1)

你有几个选择......

  1. 动态创建整个SQL字符串并执行(如Aliostad建议的那样)。
  2. 编写一个接受该字符串的存储过程,将其解析为临时表,然后针对该临时表运行查询。快速搜索将提供许多方法(here是一个)。

答案 2 :(得分:1)

您可能需要查看Arrays in SQL2005Arrays in SQL2008,具体取决于SQL Server的版本。