消息102,级别15,状态1,第1行','附近的语法不正确

时间:2019-02-06 11:25:38

标签: sql-server tsql dynamic-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

为什么会出现以下错误:

  

信息102,级别15,状态1,第1行,','附近的语法不正确。

2 个答案:

答案 0 :(得分:0)

@Collist生成的查询不是有效的SQL,因此无法使用sp_executesql来执行

您同时缺少SELECTFROM

按如下所示进行更改。

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)

您似乎希望支持通用列名-甚至包括具有非标准字符的列名(即需要转义)。

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

  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;