0

我测试下面的查询并正常工作

select * from tbl where userName in ('A','B','C')

但是当我创建一个存储过程并将参数传递给它时不起作用(参数正确)

SqlCommand sc = new SqlCommand("exec example @userName",...
sc.Parameters.AddWithValue("@userName", "'A','B','C'");
...

// Stored Procedure
create procedure example 
    @users varchar(100)
as
    select * from tbl where userName in ('@users')
4

2 回答 2

2

不要将论点放在引号中。

但是,只需:

select * from tbl where userName in (@users)

也不起作用,因为您试图在in恰好代表元素列表的字符串上使用该函数。

您需要将字符串转换为数组,然后在 select 语句中使用它:

MSDN 有一个示例函数用于执行此操作

CREATE FUNCTION dbo.Split 
   (  @Delimiter varchar(5), 
      @List      varchar(8000)
   ) 
   RETURNS @TableOfValues table 
      (  RowID   smallint IDENTITY(1,1), 
         [Value] varchar(50) 
      ) 
AS 
   BEGIN
      DECLARE @LenString int 

      WHILE len( @List ) > 0 
         BEGIN 
            SELECT @LenString = 
               (CASE charindex( @Delimiter, @List ) 
                   WHEN 0 THEN len( @List ) 
                   ELSE ( charindex( @Delimiter, @List ) -1 )
                END
               ) 

            INSERT INTO @TableOfValues 
               SELECT substring( @List, 1, @LenString )

            SELECT @List = 
               (CASE ( len( @List ) - @LenString ) 
                   WHEN 0 THEN '' 
                   ELSE right( @List, len( @List ) - @LenString - 1 ) 
                END
               ) 
         END
      RETURN 
    END 

然后像这样使用它:

select * from tbl where userName in (SELECT * FROM dbo.Split( ',', @users ))
于 2013-02-24T15:16:29.940 回答
1

众所周知,“in”查询很难参数化。首先,不要将参数放在引号中 - 这样它就不是参数:它是一个字符文字。但是:您也不能使用单个参数 - 因为这将搜索一个仅包含引号和逗号的单个值 - 而不是您想要的。

这里有多种方法;例如,在服务器上使用“拆分”功能并在内部加入该结果。但是,一些工具也有帮助。例如,“dapper”允许语法调整:

var names = new List<string> { "A", "B", "C" };

var users = connection.Query<User>(
    "select * from users where name in @names",
    new { names }).ToList();

该库使用多个参数将其扩展为正确的“输入”查询。

于 2013-02-24T15:39:12.830 回答