代码之家  ›  专栏  ›  技术社区  ›  StealthRT

SQL Server从XML路径中删除尾部逗号

  •  2
  • StealthRT  · 技术社区  · 7 年前

    我有以下代码,用于提取给定表中我的列的调用内容:

    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行
    “)”附近的语法不正确。

    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\u INSERT时指定。

    多亏了@Páa¨a¨这是最终的工作查询代码:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Pரதீப்    7 年前

    您需要使用动态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;