declare @collist nvarchar(max)
SET @Collist = STUFF((SELECT ',[' + COLUMN_NAME + ']' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Sales'
AND COLUMN_NAME NOT IN ('User_1','User_2','User_3','User_4')
FOR XML PATH('')),1,1,'')
EXECUTE sp_executesql @collist
为什么会出现以下错误:
信息102,级别15,状态1,第1行,','附近的语法不正确。
答案 0 :(得分:0)
由@Collist
生成的查询不是有效的SQL,因此无法使用sp_executesql
来执行
您同时缺少SELECT
和FROM
按如下所示进行更改。
declare @collist nvarchar(max)
SET @Collist = 'SELECT ' + STUFF((SELECT ',[' + COLUMN_NAME + ']' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Sales'
AND COLUMN_NAME NOT IN ('User_1','User_2','User_3','User_4')
FOR XML PATH('')),1,1,'') + ' FROM Sales'
EXECUTE sp_executesql @collist
一个观察结果,您可以使用[' + COLUMN_NAME + ']'
QUOTENAME(COLUMN_NAME)
使用QUOTENAME
,您的查询应如下所示。
declare @collist nvarchar(max)
SET @Collist = 'SELECT ' + STUFF((SELECT ',' + QUOTENAME(COLUMN_NAME) + '' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Sales'
AND COLUMN_NAME NOT IN ('User_1','User_2','User_3','User_4')
FOR XML PATH('')),1,1,'') + 'FROM [Sales]'
EXECUTE sp_executesql @collist
答案 1 :(得分:0)
您似乎希望支持通用列名-甚至包括具有非标准字符的列名(即需要转义)。
要正确处理此问题,您需要做两件事:
QUOTENAME()
引用标识符名称。TYPE
选项处理XML中的特殊字符。您可以按照以下步骤进行操作:
DECLARE @collist nvarchar(max);
DECLARE @sql NVARCHAR(MAX);
SET @Collist = STUFF( (SELECT ', ', QUOTENAME(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Sales' AND
COLUMN_NAME NOT IN ('User_1', 'User_2', 'User_3', 'User_4')
FOR XML PATH(''), TYPE
).VALUE('.', 'NVARCHAR(MAX)'
), 1, 2, ''
);
SELECT @sql = 'SELECT ' + @collist + ' FROM Sales';
EXECUTE sp_executesql @sql;