【问题标题】:SQL Server remove trailing comma from XML pathSQL Server 从 XML 路径中删除尾随逗号
【发布时间】: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


【解决方案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; 

【讨论】:

  • 感谢您的示例。我用我当前的存储过程更新了我的 OP。
  • @StealthRT - 我什至向您展示了如何删除多余的逗号。不知道你的问题到底是什么
  • 我只是向您展示了我已经在使用动态 SQL @SQLQuery。就是这样。
  • 谢谢,我终于可以使用我自己的 SP 代码了。我更新了我的 OP 以显示工作代码。
  • @StealthRT - 很高兴它帮助了你
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
  • 2019-01-10
相关资源
最近更新 更多