Сообщение 102, Уровень 15, Состояние 1, Строка 1 Неверный синтаксис рядом с ',' - PullRequest
0 голосов
/ 06 февраля 2019
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, уровень 15, состояние 1, строка 1 Неверный синтаксис рядом с ','.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Похоже, вы хотите поддерживать общие имена столбцов - даже те, которые имеют нестандартные символы (т.е. должны быть экранированы).

Для правильной обработки вам необходимы две вещи:

  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;
0 голосов
/ 06 февраля 2019

Запрос, сгенерированный @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...