簡體   English   中英

SQL Server 2017中的錯誤

[英]Bug in SQL Server 2017

我想報告SQL Server 2017中的錯誤和解決方法。Microsoft建議在此處打開文章,因此...問題與字符串串聯結合CAST和REPLACE有關。 我的代碼中經常發生的某些事情。 運行此查詢:

USE master;

PRINT @@Version

DECLARE @l NVARCHAR(MAX) = '';

SELECT @l += CAST(s.object_id AS NVARCHAR(50)) + ' ' + REPLACE(s.name, 'x', 'y') + ', '
FROM sys.tables s
ORDER BY s.name;

PRINT '> ' + @l;

SET @l = '';

SELECT @l = @l + CAST(s.object_id AS NVARCHAR(50)) + ' ' + REPLACE(s.name, 'x', 'y') + ', '
FROM sys.tables s
ORDER BY s.name;

PRINT '> ' + @l;

在我的服務器上,輸出為:

Microsoft SQL Server 2017 (RTM-CU6) (KB4101464) - 14.0.3025.34 (X64) 
    Apr  9 2018 18:00:41 
    Copyright (C) 2017 Microsoft Corporation
    Web Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) (Hypervisor)

    > 1787153412 MSreplication_options, 117575457 spt_fallback_db, 133575514 spt_fallback_dev, 149575571 spt_fallback_usg, 1483152329 spt_monitor, 
    > 1483152329 spt_monitor, 

因此,使用@l + =可行,@ l = @l +無效。 省略CAST或REPLACE時,結果相同。

看到這個答案,但是...

該代碼在SQL Server 2016和2014上給出相同的結果(錯誤)
2012年還可以

如何評估表達式

  • @l += blah = blah經過全面評估然后串聯
  • @l = @l + blah =從左到右串聯然后分配

無論哪種方式,使用此技術生成CSV都是一種內部實現,可能不應該依賴於

這行得通(在CAST + replace周圍加上了括號),因為它強制執行正確的評估順序

SELECT 
    @l = @l + (CAST(s.object_id AS NVARCHAR(50)) + ' ' + REPLACE(s.name, 'x', 'y') + ', ')
FROM sys.tables s
ORDER BY s.name;
  • @l = @l + (blah) = blah經過全面評估,然后串聯

正如您提到的那樣,您使用SQL Server 2017我建議使用STRING_AGG並且不要依賴未定義的行為。

SELECT STRING_AGG(CONCAT(s.object_id,' ',REPLACE(s.name, 'x', 'y')), ',')      
       WITHIN GROUP(ORDER BY s.name)
FROM sys.tables s

DBFiddle演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM