[英]How to calculate hash code for a mix of numbers and strings uniquely using C# and T-SQL
[英]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.