SQL Server удалить запятую из пути XML

У меня есть следующий код, который извлекает то, что мои столбцы называются в данной моей таблице:

SELECT 
   column_name + ','
FROM   
   information_schema.columns 
WHERE  
   table_name = 'maintReq'
FOR XML PATH('')

И я хочу поместить это в мой текущий запрос:

SET IDENTITY_INSERT maintReq ON; 
GO

INSERT INTO maintReq  
OUTPUT Inserted.ID 
VALUES ((SELECT ISNULL(MAX(id) + 1, 0) 
         FROM maintReq WITH(SERIALIZABLE, UPDLOCK)                   
        ),'MAYBE', 'true'); 

SET IDENTITY_INSERT maintReq OFF;

Я пытался сделать следующее сам:

SET IDENTITY_INSERT maintReq ON; 
GO
INSERT INTO maintReq (
                      SELECT 
                         column_name + ','
                      FROM   
                         information_schema.columns 
                      WHERE  
                         table_name = 'maintReq'
                      for 
                         xml path('')
                     )
   OUTPUT Inserted.ID 
      VALUES (
              (
               SELECT                                       
                  ISNULL(MAX(id)+1,0) 
               FROM     
                  maintReq WITH(SERIALIZABLE, UPDLOCK)                   
              ),'MAYBE', 'true'
             ); 
SET IDENTITY_INSERT maintReq OFF;

Но с этим я получаю ошибку:

Сообщение 156, уровень 15, состояние 1, строка 4
Неверный синтаксис рядом с ключевым словом "SELECT".

Msg 102, уровень 15, состояние 1, строка 8
Неверный синтаксис рядом с ')'.

Msg 102, уровень 15, состояние 1, строка 16
Неверный синтаксис рядом с ','.

Не уверен, что эта ошибка вызвана лишней запятой, которая была добавлена ​​к выводу пути XML, или это что-то еще?

Моя полная хранимая процедура выглядит так:

DECLARE @SQLQuery VARCHAR(MAX);
    SET @SQLQuery = 'SET IDENTITY_INSERT ' + @val1 + ' ON 
                     INSERT INTO ' +
                        @val1 + ' 
                        OUTPUT Inserted.ID 
                     VALUES ' + 
                        '(
                            (
                                SELECT 
                                    ISNULL(MAX(id)+1,0) 
                                FROM 
                                    ' + @val1 + ' WITH(SERIALIZABLE, UPDLOCK)
                            ),''' + @val2 + ''', ''' + @val3 + '''
                        ) ' +
                     'SET IDENTITY_INSERT ' + @val1 + ' OFF;'
    EXEC [dbo].[_chkQ] @SQLQuery 

Вышеуказанный SP - это то, что я сейчас получаю эту ошибку

Явное значение для столбца идентификаторов в таблице "maintReq" можно указывать только в том случае, если используется список столбцов, а IDENTITY_INSERT включен.

Благодаря @Pரதீப் это последний рабочий код запроса:

SET @SQLQuery = 'SET IDENTITY_INSERT ' + @val1 + ' ON 
                     INSERT INTO ' + @val1 + '(' + 
                        Stuff(
                               (SELECT 
                                    ',' + quotename(column_name) 
                                FROM  
                                    information_schema.columns 
                                WHERE 
                                    table_name = '' + @val1 + '' 
                                FOR xml path('')
                               ), 1, 1, ''
                             ) + 
                     ')
                        OUTPUT Inserted.ID 
                     VALUES ' + 
                        '(
                            (
                                SELECT 
                                    ISNULL(MAX(id)+1,0) 
                                FROM 
                                    ' + @val1 + ' WITH(SERIALIZABLE, UPDLOCK)
                            ),''' + @val2 + ''', ''' + @val3 + '''
                        ) ' +
                     'SET IDENTITY_INSERT ' + @val1 + ' OFF;'

1 ответ

Решение

Вам нужно использовать динамический SQL

DECLARE @col_list VARCHAR(8000)= ''

SET @col_list = Stuff((SELECT ',' + quotename(column_name) --"quotename" is to escape illegal characters
                       FROM   information_schema.columns
                       WHERE  table_name = 'maintReq'
                       FOR xml path('')), 1, 1, '')
SET IDENTITY_INSERT maintReq ON;

EXEC ('
INSERT INTO maintReq ('+@col_list+')
   OUTPUT Inserted.ID 
      VALUES (
              (SELECT                                       
                  ISNULL(MAX(id)+1,0) 
               FROM     
                  maintReq WITH(SERIALIZABLE, UPDLOCK)                   
              ),''MAYBE'', ''true''
             ); ')

SET IDENTITY_INSERT maintReq OFF; 
Другие вопросы по тегам