簡體   English   中英

C#T-SQL使用字符串數組創建IN

[英]C# T-SQL create IN with array of strings

也許我做的事情不正確,但是我需要創建一個字符串列表來過濾某些SQL SELECT查詢,而我所能找到的答案就是僅對單個參數值進行轉義。

給定此數組:

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

我使用一個功能

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM