【发布时间】:2017-12-27 15:13:56
【问题描述】:
我有以下代码可以在我的给定表中提取我的列的名称:
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”附近的语法不正确。消息 102,第 15 级,状态 1,第 8 行
')' 附近的语法不正确。消息 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 为 ON 时指定。
感谢@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;'
【问题讨论】:
-
你可以使用STUFF功能
-
您不能以这种方式使用 INSERT 语句。您应该进行动态查询,然后执行它。当然,多余的逗号必须删除。
-
您的
Values子句固定为 3 列。为什么需要动态列? -
嗯,这整件事对我来说似乎是一个 XYProblem。为什么你仍然需要来自
information_schema.columns的列名? sql语句中的列名必须硬编码,或者整个语句必须是动态SQL。 -
@ZoharPeled 如果我没有,那么它会得到错误 只有在使用列列表并且 IDENTITY_INSERT 为开。
标签: sql-server sql-server-2016 insert-into identity-insert