【问题标题】:How to append consecutive values in T-SQL?如何在 T-SQL 中附加连续值?
【发布时间】:2019-09-10 13:16:22
【问题描述】:

我无法将@msg 的当前值附加到最新值。第一个@msg 可以,因为它会打印出所有值,但是当涉及到第二个@msg 时,它只返回最新值。我有一个想法来创建一个临时表来存储最新值。在这种情况下,您有什么建议?

FETCH NEXT FROM c_fileList INTO @dbName, @filename
   WHILE @@FETCH_STATUS = 0
   BEGIN
         SET @msg = 'Delete backup file: ' + @filename + ' For Database: ' + @dbName 
         PRINT @msg
         FETCH NEXT FROM c_fileList INTO @dbName, @filename
   END
   PRINT @msg

【问题讨论】:

  • 抱歉,我无法满足您的需求...请尝试创建minimal reproducible example。在这种情况下,我足以添加一个临时表的 DDL、两个或三个样本行和预期的输出......

标签: sql tsql sql-server-2012 cursor


【解决方案1】:

SET @msg = 'Delete...' 不会连接 @msg 的值,而是重新分配它。如果要连接该值,则为SET @msg = @msg + 'Delete...'

似乎使用STUFFFOR XML PATH 会容易得多。游标是一种非常缓慢的方式来制作有效的分隔列表。

DECLARE @msg nvarchar(4000);

SET @msg = STUFF((SELECT NCHAR(10) +
                         N'Delete backup file: ' + {FileName Column} + N' for Database: ' + {DBName Column}
                  FROM YourTable
                  --ORDER BY ???
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(4000)'),1,1,N'');

PRINT @Msg;

应该已经很明显了,这将截断任何超过 4,000 个字符的值(这是 PRINT 的最大长度)。

【讨论】:

    【解决方案2】:

    如果我对您要完成的工作以及您的工作方式的假设是正确的,则您不需要游标或临时表:

    IF OBJECT_ID('tempdb..#tempFiles', 'U') IS NOT NULL
        DROP TABLE #tempFiles
    
    CREATE TABLE #tempFiles
    (
        RecordID INT IDENTITY(1, 1) NOT NULL
        , DBName VARCHAR(32)
        , DBFileName VARCHAR(32)
    )
    
    INSERT INTO #tempFiles VALUES
    ('DBOne', 'c:\DBOnefileone.mdf')
    , ('DBOne', 'c:\DBOnefiletwo.mdf')
    , ('DBOne', 'c:\DBOnefilethree.mdf')
    , ('DBOne', 'c:\DBOnelogfileone.ldf')
    , ('DBTwo', 'c:\DBTwofileone.mdf')
    , ('DBTwo', 'c:\DBTwologfileone.ldf')
    
    DECLARE @msg VARCHAR(MAX) = ''
    
    SELECT  @msg = @msg + 'Delete backup file: ' + DBFileName + ' For Database: ' + DBName + CHAR(13) + CHAR(10)
    FROM    #tempFiles
    ORDER BY RecordID
    
    print @msg
    

    【讨论】:

    • 古怪的更新是一个滑坡……我不知道排序顺序是否重要……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2010-10-02
    • 2020-03-28
    相关资源
    最近更新 更多