2013-07-08 35 views
0

用戶從下拉列表中選擇各種單詞,並將這些值添加到以逗號分隔的字符串中。當將字符串傳遞給存儲過程時,我希望它可以存在該表單的select * from從列表中選擇* where column =(逗號分隔字符串中的任何值)

傳遞到存儲過程表

id----word 

1-----cat 

2-----dog 

3-----mouse 

4-----dog 

cat, dog所以返回列1,2和4

有沒有在SQL Server這樣做的呢?

+1

這將是更好地從用戶界面到傳遞數據數據庫服務器使用支持存儲多個不同值的數據類型,例如(理想情況下)表值參數或XML。 –

+0

'貓,狗'這個列表是動態的嗎?或兩個值是固定的? (我的意思是數字) – Nithesh

回答

2

你首先需要做一個函數SplitCSV:

CREATE FUNCTION [dbo].[SplitCSV] (@CSVString VARCHAR(8000), @Delimiter CHAR(1)) 
RETURNS @temptable TABLE (items VARCHAR(8000)) 
AS 
BEGIN 
    DECLARE @pos INT; 
    DECLARE @slice VARCHAR(8000); 

    SELECT @pos = 1; 
    IF LEN(@CSVString) < 1 OR @CSVString IS NULL RETURN; 

    WHILE @pos!= 0 
    BEGIN 
     SET @pos = CHARINDEX(@Delimiter,@CSVString); 
     IF @pos != 0 
      SET @slice = LEFT(@CSVString, @pos - 1); 
     ELSE 
      SET @slice = @CSVString; 

     IF(LEN(@slice) > 0) 
      INSERT INTO @temptable(Items) VALUES (@slice); 

     SET @CSVString = RIGHT(@CSVString, LEN(@CSVString) - @pos); 
     IF LEN(@CSVString) = 0 BREAK; 
    END 
    RETURN 
END 
GO 

那麼你可以使用它像:

SELECT * 
FROM myTable 
WHERE ID IN (
    SELECT items FROM [dbo].[SplitCSV]('1,2,3,4,5', ',') 
) 
+0

對不起,armen,這將是我的下一步,尋找一種方法來實現它的功能。我上次看過時只有mishik的回答,這個作品完美無缺,謝謝 – Win

+0

很高興我幫了你,並希望你總能找到更好的答案! – armen

+0

你必須使用'word'列:WHERE Word IN(SELECT items from [dbo]。[SplitCSV]('dog,cat,rat',',')) – armen

4

使用IN

SELECT * 
FROM your_table 
WHERE word IN ('cat', 'dog') 
+0

正是我想要的,謝謝 – Win

+0

...是的,但你說「返回列1,2和4」! – armen

0

如果你想選擇除鼠標所有的動物,你可以使用NOT IN

SELECT * FROM 
TABLE 
WHERE Word Not IN('Mouse') 

這樣就可以避免類型很多類型的動物

1
SELECT * 
FROM Table 
WHERE '%,' + Word + ',%' LIKE ',' + @your_csv_param + ',' 

參數和列的開始和結尾處的額外逗號是爲了防止搜索匹配012例如,與catfish

0
CREATE FUNCTION 
ALTER FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20) = ' ') 
RETURNS @Strings TABLE 
( 
    position int IDENTITY PRIMARY KEY, 
    value varchar(8000) 
) 
AS 

BEGIN 

DECLARE @index int 
SET @index = -1 

WHILE (LEN(@text) > 0) 
    BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
     BEGIN 
     INSERT INTO @Strings VALUES (@text) 
      BREAK 
     END 

    IF (@index > 1) 
     BEGIN 
     INSERT INTO @Strings VALUES (LEFT(@text, @index - 1)) 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
     END 
    ELSE 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END 

    RETURN 

END 

---- 

select * from yourtable where column in (select value from fn_Split(@para1,',') 
相關問題