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;