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();

ライブラリは、複数のパラメーターを使用して、これを正しい "in" クエリに展開します。

于 2013-02-24T15:39:12.830 に答える