2011-06-30 18 views
0

這裏是在存儲過程中的語句的例子:字符串的整數值沒有一種在具有工作... IN子句中的存儲過程

SELECT @nDBNum = Num 
    FROM Num_members 
GROUP BY Num 
    HAVING SUM(CASE WHEN Part_No IN (@strOrderedString) THEN 1 ELSE 0 END) = @nCount 
    AND COUNT(*) = @nCount 

如果變量@strOrderedString在「IN」條款只有一個數字的事情工作正常。然而,如果這個字符串有一個由逗號分隔的數字列表,我會從執行存儲過程中得到一個語法錯誤(例如:將varchar值'1259,2423,2701,2415,2453'轉換爲數據類型爲int的列的語法錯誤)

如何獲取此查詢的工作?

+0

爲什麼它不使用內部子查詢? –

回答

1

由於SQL不支持一個變量來表示IN子句的值的逗號分隔列表 - 它希望每個值都有一個變量,並且在SQL中定義了逗號。您需要使用動態SQL,其中SQL是在執行前連接的字符串,用於您發佈的工作。

因爲您使用的是SQL Server 2000,所以您需要使用EXEC/EXECUTE來執行動態SQL。 sp_executesql是SQL Server 2005+。

+0

你能舉個例子嗎? – user774512

+0

動態sql是不需要的,你可以使用tvf來轉換字符串並將其用作單列列表。 – keithwarren7

+0

什麼是tvf,我將如何應用該方法? – user774512

0

您可以使用輸入字符串並調用一個表值函數,將其轉換爲可以嵌套到IN子句中的單個列表。比使用動態sql更好。

CREATE FUNCTION [dbo].[ConvertCSVToTable] (@StringInput VARCHAR(8000)) 
RETURNS @OutputTable TABLE (Id int) 
AS 
BEGIN 

    DECLARE @String VARCHAR(10) 

    WHILE LEN(@StringInput) > 0 
    BEGIN 
     SET @String  = LEFT(@StringInput, 
           ISNULL(NULLIF(CHARINDEX(',', @StringInput) - 1, -1), 
           LEN(@StringInput))) 
     SET @StringInput = SUBSTRING(@StringInput, 
            ISNULL(NULLIF(CHARINDEX(',', @StringInput), 0), 
            LEN(@StringInput)) + 1, LEN(@StringInput)) 

     INSERT INTO @OutputTable (Id) 
     VALUES (@String) 
    END 

    RETURN 
END 

這將允許你仍然參數列表輸入並避免動態sql,結果會是這個樣子......

SELECT @nDBNum = Num FROM Num_membersGROUP BY Num 
    HAVING SUM(CASE WHEN Part_No IN (
SELECT Id from dbo.ConvertCSVToTable(@strOrderedString) 
) 
    THEN 1 ELSE 0 END) = @nCount 
    AND COUNT(*) = @nCount 
+0

您假設這是針對SQL Server的,並且這些值在另一個表中的數據庫中不存在。 MySQL還支持發佈的語法。 –

+0

公平不夠,只是問題的性質使我認爲他真正的問題是測試一系列值。 – keithwarren7

+0

我不明白爲什麼OP會迴避這個數據庫的問題...... –

0

你可以通過值作爲XML參數存儲程序。

<Ids> 
    <Id>1</Id> 
    <Id>2</Id> 
    <Id>3</Id> 
    <Id>4</Id> 
</Ids> 

並將其分配給表變量;

DECLARE @IdsToSearch table(id int); 
INSERT INTO @IdsToSearch (id) 
SELECT Ids.Id.value('.','INT') FROM @xml.nodes('/Ids/Id') as Ids(Id) 

然後這可以在你的sql中使用;

SELECT @nDBNum = Num 
    FROM Num_members 
GROUP BY Num 
    HAVING SUM(CASE WHEN Part_No IN (SELECT id FROM @IdsToSearch) THEN 1 ELSE 0 END) = @nCount 
    AND COUNT(*) = @nCount 

這裏假設你正在使用SQL Server 2005/2008

相關問題