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
Warum Sie eine dynamische SQL-Anweisung hier brauchen? Während Sie einfach die '@ CountryNames' in Abfrage übergeben konnten. – Shaharyar
@Shaharyar Dies ist ein Teil meines Codes, wie ich andere Teile haben, um zu fragen – Clifford
Können Sie uns eine Probe auf @CountryNames Werte geben? – Hadi