消息 102,级别 15,状态 1,第 1 行“,”附近的语法不正确
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','
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
为什么会出现以下错误:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','.
@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
一次观察,您可以使用 QUOTENAME(COLUMN_NAME)
而不是 [' + 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
选项处理 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;
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
为什么会出现以下错误:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ','.
@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
一次观察,您可以使用 QUOTENAME(COLUMN_NAME)
[' + 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
选项处理 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;