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