2

我有以下代码可以在我的给定表中提取我的列的名称:

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 是我目前收到此错误的原因:

只有在使用列列表并且 IDENTITY_INSERT 为 ON 时,才能为表 'maintReq' 中的标识列指定显式值。

感谢@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;'
4

1 回答 1

2

你需要使用动态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; 
于 2017-12-27T15:40:52.307 回答