1

多分私は何かを正しくしていませんが、文字列のリストを作成してSQLSELECTクエリをフィルタリングする必要があり、単一のパラメーター値のみをエスケープするための答えしか見つかりません。

この配列を考えると:

string[] domains = new string[] { "sec", "krn", "op", "ip" };

このクエリを作成する必要があります

SELECT * FROM user_domains WHERE name IN ("sec", "krn", "op", "ip")

:これは実際のクエリではありませんが、この質問のポイントを示しています。

単純な解決策は、クエリを次のように作成することです。

SELECT * FROM user_domains WHERE name IN (@p1, @p2, @p3, @p4)

そして、次のようにフォーマットされたパラメーターを使用してクエリを実行します

Dictionary<string,string> inTerms = domains
     .Select((t, i) => new { Key = "p" + i, Term = t })
     .ToDictionary(item => item.Key, item => item.Term,
                   StringComparer.OrdinalIgnoreCase);

別のアプローチはありますか?

アップデート

単純な文字列比較 (別名) をコンマまたは別の方法で区切られた用語の文字列と同じように簡単かつ高速に実行できますか?index of

元:

SELECT * FROM user_domains WHERE CHARINDEX(name, @terms) > 0

4

1 に答える 1

1

関数を使用してこれを行います

CREATE FUNCTION dbo.fnListToCol (
    @sInputList VARCHAR(8000) -- List of delimited items
  , @sDelimiter VARCHAR(2) = '|' -- delimiter that separates items
) RETURNS @List TABLE (item VARCHAR(8000))

BEGIN
DECLARE @sItem VARCHAR(8000)
WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
 BEGIN
 SELECT
  @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
  @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

 IF LEN(@sItem) > 0
  INSERT INTO @List SELECT @sItem
 END

IF LEN(@sInputList) > 0
 INSERT INTO @List SELECT @sInputList -- Put the last item in
RETURN
END
GO

次に、区切られたパラメーター (「sec|krn」など) をコードに作成し、次のようにプロシージャーに渡します。

WHERE ( ( VSSAS.Location IN ( SELECT * FROM  dbo.fnListToCol(@LocationFilter, '|') ) ) OR ( @LocationFilter IS NULL ) )
于 2013-03-18T11:19:48.733 に答える