消息102,级别15,状态1,行1个附近有语法错误 ''

问题描述 投票:0回答:2
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个附近有语法错误 ''。

sql-server tsql dynamic-sql
2个回答
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

0
投票

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

要妥善处理好这一点,你需要两样东西:

  1. 使用QUOTENAME()为引用的标识符名称。
  2. 处理特殊字符在XML中,通过使用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;
© www.soinside.com 2019 - 2024. All rights reserved.