如何傳遞SQL文本包含IN的命令的參數值。 即我的命令SQL文本類似於SELECT * FROM USERS WHERE USERID IN (1,2,3)
。將參數傳遞給命令文本包含的命名命令IN
有很多例子,如MSDN has,但coudn't找到一個傳遞值的IN。試圖採取一個變量並將值設置爲單個字符串,但SQL不會以這種方式工作。
如何傳遞SQL文本包含IN的命令的參數值。 即我的命令SQL文本類似於SELECT * FROM USERS WHERE USERID IN (1,2,3)
。將參數傳遞給命令文本包含的命名命令IN
有很多例子,如MSDN has,但coudn't找到一個傳遞值的IN。試圖採取一個變量並將值設置爲單個字符串,但SQL不會以這種方式工作。
你應該有一個UDF其中(例如)CSV字符串轉換爲數值表。 然後,你的查詢可以像一些事情:
SELECT * FROM yourTable 其中yourField IN
是的。這個選項總是在那裏。我只是想知道是否有任何我可以省略這個練習,因爲我不想修改即將到來的SQL,除了傳遞參數和系統替換它們的值。 – Cannon
簡短的答案是沒有好辦法做到這一點。
如果您確實只使用數值列表,您可能不需要使用參數,因爲此功能主要用於防止SQL注入攻擊。但是,如果您有一組int
s,並使用它來構建查詢,那麼您很安全。
我能想到的唯一方法是爲每個項目添加一個參數。例如:
SELECT * FROM USERS WHERE USERID IN (@p1, @p2, @p3)
然後,循環訪問C#中的數組,併爲每個項目創建一個參數。
希望這會有所幫助!
這已被問了很多很多次。兩種方法映入腦海:
如果你有SQL2008,你可以通過一個「table value parameter」 (TVP),你的表參數有「在」條款爲您的值,然後有一個「其中」子句檢查值是「(從tvp選擇無論)」。
如果你沒有SQL2008,你可以用一個 「公用表表達式」 (CTE),如...
declare @t table (xyz varchar(100))
insert into @t values ('hello')
insert into @t values ('there')
insert into @t values ('world')
insert into @t values ('10')
insert into @t values ('20')
insert into @t values ('30')
declare @a as varchar(120)
set @a = 'hello,10,30'
;with cte as
(
select cast(null as varchar(max)) as 'v', 1 as s, charindex(',' , @a, 0) as e
union all
select cast(substring(@a, s, e-s) as varchar(max)), e+1, charindex(',' , @a + ',', e+1)
from cte where e!=0
)
select *
from @t
where (xyz in (select v from cte where v is not null))
在這個例子中(上圖),字符串@ a是您希望用於「in」子句的逗號分隔值列表,並且cte只是逐個去除這些值。當然,這只是一個簡單的例子,可能需要檢查空字符串,連續逗號等。
當然,通常的注意事項適用於使用SQL對(有效)做字符串操作。
問候, 羅斯
的可能重複(從dbo.yourUDF(yourCSV)選擇yourColumn)([參數化IN子句的SQL?] http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause) –
你的意思是傳遞值在一個PreparedStatement或什麼?! – amrfaissal