2017-03-17 46 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