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个附近有语法错误 ''。
通过@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
你似乎想支持通用列名 - 即使是那些非标准的字符(即需要进行转义)。
要妥善处理好这一点,你需要两样东西:
QUOTENAME()
为引用的标识符名称。TYPE
选项。你可以这样做的:
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;