消息 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

您似乎想要支持通用列名 -- 即使是那些具有非标准字符(即需要转义)的列名。

要正确处理此问题,您需要做两件事:

  1. 使用 QUOTENAME() 引用标识符名称。
  2. 使用 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;