SQL Server> = 2012の変数に値を累積しようとしています。
以下のケース1で機能しますが、ケース2では、予期された「、AB、EF、CD」ではなく「、CD」という回答が返されます。なぜですか。
MMSの場合:
USE MyDB
GO
-- Create a simple table
CREATE TABLE Tbl1 (Code VARCHAR(2), So TINYINT NULL)
INSERT INTO Tbl1 VALUES('AB', 10)
INSERT INTO Tbl1 VALUES('CD', NULL)
INSERT INTO Tbl1 VALUES('EF', 5)
GO
-- Case 1
DECLARE @MyVar VARCHAR(255) = ''
SELECT @MyVar=@MyVar + ',' + Code FROM Tbl1 ORDER BY So
SELECT @MyVar
GO
-- Case 2
DECLARE @MyVar VARCHAR(255) = ''
SELECT @MyVar=@MyVar + ',' + Code FROM Tbl1 ORDER BY ISNULL(So, 255)
SELECT @MyVar
GO
SELECTステートメントで変数を使用して値を連結しないでください(つまり、集計値を計算するため)。予期しないクエリ結果が発生する可能性があります。これは、SELECTリスト内のすべての式(割り当てを含む)が、出力行ごとに1回だけ実行されるとは限らないためです。
ORDER BY
条項がなくDISTINCT
、集計は期待どおりであるという意見があります(公式ドキュメントにはありません)。
SQL Server 2017以降を使用STRING_AGG()
している場合は、次を使用して期待される出力を作成できます。
DECLARE @MyVar VARCHAR(255) = ''
SELECT @MyVar = STRING_AGG(Code, ',') WITHIN GROUP (ORDER BY ISNULL(So, 255))
FROM Tbl1
SELECT @MyVar
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加