2011-04-11 29 views
1

的我有以下SQL:過濾一個ID列對某個範圍的值

SELECT ',' + LTRIM(RTRIM(CAST(vessel_is_id as CHAR(2)))) + ',' AS 'Id' 
FROM Vessels 
WHERE ',' + LTRIM(RTRIM(CAST(vessel_is_id as varCHAR(2)))) + ',' IN (',1,2,3,4,5,6,') 

基本上,我要篩選的vessel_is_id針對整數值的變量列表(其傳過來的varchar進存儲過程)。現在,上面的SQL不起作用。我在表中有'vessel__is_id'爲1的行,但是它們沒有被返回。

有人可以爲我提出一個更好的方法嗎?或者,如果上面是OK

編輯:

的樣本數據

| vessel_is_id | 
| ------------ | 
|  1  | 
|  2  | 
|  5  | 
|  3  | 
|  1  | 
|  1  | 

所以我想返回的所有上述地方vessel_is_id是可變濾波器即「1,3」 - 這應該返回4條記錄。

乾杯。 Jas。

+1

請出示樣本數據,因爲它是存儲在數據庫和樣本預期的結果。 – HLGEM 2011-04-11 13:17:26

+0

什麼版本的SQL? – SQLMason 2011-04-11 13:35:40

+0

@dan - SQL Server 2008 R2 – 2011-04-11 14:51:48

回答

1
IF OBJECT_ID(N'dbo.fn_ArrayToTable',N'FN') IS NOT NULL 
    DROP FUNCTION [dbo].[fn_ArrayToTable] 
GO 
CREATE FUNCTION [dbo].fn_ArrayToTable (@array VARCHAR(MAX)) 
-- ============================================= 
-- Author:  Dan Andrews 
-- Create date: 04/11/11 
-- Description: String to Tabled-Valued Function 
-- 
-- ============================================= 
RETURNS @output TABLE (data VARCHAR(256)) 
AS 
BEGIN 

    DECLARE @pointer INT 
    SET @pointer = CHARINDEX(',', @array) 

    WHILE @pointer != 0 
    BEGIN 
     INSERT INTO @output 
     SELECT RTRIM(LTRIM(LEFT(@array,@pointer-1))) 

     SELECT @array = RIGHT(@array, LEN(@array)[email protected]), 
       @pointer = CHARINDEX(',', @array) 
    END 

    RETURN 
END 

,你可以申請,如:

SELECT * FROM dbo.fn_ArrayToTable('2,3,4,5,2,2') 

,並在你的情況:

SELECT LTRIM(RTRIM(CAST(vessel_is_id AS CHAR(2)))) AS 'Id'  
FROM Vessels  
WHERE LTRIM(RTRIM(CAST(vessel_is_id AS VARCHAR(2)))) IN (SELECT data FROM dbo.fn_ArrayToTable('1,2,3,4,5,6') 
+0

剛剛嘗試過你的解決方案,它很好地工作。 – 2011-04-11 14:55:19

0

由於Sql服務器沒有數組,您可能需要考慮將一組值作爲XML類型傳入。然後,您可以將XML類型轉換爲關係並加入其中。以經過時間考驗的酒吧數據庫爲例。當然,客戶可能會也可能不會輕鬆地爲參數值生成XML,但這種方法對於大多數「逗號分隔」值方法不適用的sql注入來說是安全的。

declare @stateSelector xml 
set @stateSelector = '<values> 
<value>or</value> 
<value>ut</value> 
<value>tn</value> 
</values>' 

select * from authors 
where state in (select c.value('.', 'varchar(2)') from @stateSelector.nodes('//value') as t(c)) 
+0

我會放棄這一點。目前我正處於另一項任務的中間,但稍後會提供反饋意見。 – 2011-04-11 13:31:24