2017-03-17 47 views
0

有人可以幫我動態搜索存儲過程嗎?SQL Server存儲過程困境

這是我的存儲過程:

DECLARE mycursorForCountry CURSOR FOR 
    SELECT CountryNames 
    FROM [Countries].[dbo].[World] 
    WHERE UserID = @userID 

    OPEN mycursorForCountry 

    FETCH NEXT FROM mycursorForCountry INTO @CountryNames 

    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     INSERT INTO @CountryTbl 
      SELECT DISTCINT * 
      FROM ufn_Split((@CountryNames),',') 

     FETCH NEXT FROM mycursorForCountry INTO @CountryNames 
    END 

    CLOSE mycursorForCountry 
    DEALLOCATE mycursorForCountry 

    DECLARE @SQL nvarchar(MAX) 
    SET @SQL = 'SELECT * FROM [Information].[dbo].[Media] WHERE Country_Name IN('[email protected]+')' 

    EXEC sp_executesql @SQL 

我得到一個錯誤:

Msg 102, Level 15, State 1, Line 260
Incorrect syntax near 'AFRICA'

+0

爲什麼你在這裏需要動態SQL語句?雖然你可以在查詢中通過'@ CountryNames' .. – Shaharyar

+0

@Shaharyar這是我的代碼的一部分,因爲我有其他部分來查詢 – Clifford

+0

你可以給我們一個關於@CountryNames值的示例嗎? – Hadi

回答

2

行:

set @SQL = 'SELECT * FROM [Information].[dbo].[Media] WHERE 
    Country_Name IN('[email protected]+')' 

未被打包通過@CountryNames返回的值用單引號。它更改爲以下(使用兩個單引號轉義成一個單引號):

set @SQL = 'SELECT * FROM [Information].[dbo].[Media] WHERE 
    Country_Name IN('''[email protected]+''')' 
    --    ^-------------------^------- added two single-quotes 

建議

當你動態創建以這種方式SQL語句,打印出來的SQL語句使用print @SQL進行調試,以排除此類情況。如果你這樣做,你已經注意到@SQL內容是不正確的以下查詢:

SELECT * FROM [Information].[dbo].[Media] WHERE Country_Name IN (AFRICA) 

這將表明你,你曾在IN語句的字符串,這不是裹着引號。


編輯:爲了正確地產生以逗號分隔的國家

DECLARE @CountryNames NVARCHAR(MAX) 

SET @CountryNames = (SELECT '''' + CountryNames + ''',' 
FROM [Countries].[dbo].[World] 
WHERE UserID = @userID 
FOR XML PATH('')) 

PRINT substring(@CountryNames, 1, len(@CountryNames) - 1) 

FOR XML PATH('')符連接單獨的行插入逗號分隔值的單個行的列表,並且substring()函數用於刪除尾隨逗號。

這樣可以避免循環遊標以形成逗號分隔列表。

在這種情況下,不需要在@SQL變量的格式中插入兩個單引號,因爲所有必需的雙引號都是在上述語句本身中形成的。


編輯2:修訂SQL

以下是完整的SQL做你所需要的。需要注意的是它不使用遊標,也不使用表@CountryTbl

DECLARE @CountryNames NVARCHAR(MAX) 

-- Prepares a comma-separated list of countries, e.g.: 'Africa','Nigeria', 
-- Note that there is a trailing comma 
SET @CountryNames = (SELECT '''' + CountryNames + ''',' 
    FROM [Countries].[dbo].[World] 
    WHERE UserID = @userID 
    FOR XML PATH('')) 

-- Remove the trailing comma 
SET @CountryNames = substring(@CountryNames, 1, len(@CountryNames) - 1) 

DECLARE @SQL nvarchar(MAX) 
SET @SQL = 'SELECT * FROM [Information].[dbo].[Media] WHERE Country_Name IN('+ @CountryNames +')' 

EXEC sp_executesql @SQL