2017-03-17 4 views
0

Kann mir bitte jemand mit der dynamischen Suche gespeicherte Prozedur helfen?SQL Server gespeicherte Prozedur Leiden

Das ist mein gespeicherte Prozedur:

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 

Ich erhalte eine Fehlermeldung:

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

+0

Warum Sie eine dynamische SQL-Anweisung hier brauchen? Während Sie einfach die '@ CountryNames' in Abfrage übergeben konnten. – Shaharyar

+0

@Shaharyar Dies ist ein Teil meines Codes, wie ich andere Teile haben, um zu fragen – Clifford

+0

Können Sie uns eine Probe auf @CountryNames Werte geben? – Hadi

Antwort

2

Die Linie:

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

hat den Wert zurück nicht eingewickelt durch @CountryNames in einfachen Anführungszeichen. Ändern Sie den folgenden (unter Verwendung von zwei einfachen Anführungszeichen entweicht es in einem einzigen Apostroph):

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

Anregung

Wenn Sie dynamisch SQL-Anweisungen in einer solchen Art und Weise zu schaffen werden, drucken Sie die SQL-Anweisung Verwenden Sie print @SQL für Debugging-Zwecke, um solche Fälle zu beheben. Wenn Sie dies getan würde, können Sie den Inhalt von @SQL bemerkt haben würde war die folgende falsche Abfrage:

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

, die Ihnen haben darauf hingewiesen würde, dass Sie eine Zeichenfolge in der IN Anweisung hatte, die nicht umgebrochen wurde Anführungszeichen.


EDIT: Um eine durch Kommata getrennte Liste von Ländern

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) 

Die FOR XML PATH('') verkettet getrennte Zeilen in eine einzige Reihe von durch Kommas getrennten Werte und die substring() Funktion korrekt generiert verwendet Entferne das nachgestellte Komma.

Dies vermeidet die Notwendigkeit, einen Cursor durchzulaufen, um die durch Kommas getrennte Liste zu bilden.

In diesem Fall müssen keine zwei einfachen Anführungszeichen in die Bildung der @SQL Variable eingefügt werden, da alle erforderlichen doppelten Anführungszeichen in der obigen Anweisung selbst gebildet werden.


EDIT 2: Überarbeitete SQL

Hier finden Sie die komplette SQL zu tun, was Sie brauchen. Beachten Sie, dass es nicht Cursor nicht verwendet, noch verwendet es eine Tabelle @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 
Verwandte Themen