2017-11-14 10 views
0

SELECT操作を使用して値を割り当てるT-SQL変数があります。 "SELECT"クエリは複数の行を返す可能性があるため、すべての値をコンマで区切って追加するCOALESCE関数を使用しています。これまでのところ、すべての良いクエリは意図したとおりに動作しています。しかし、order by節を使用して値を順序付けしようとすると、1つの行だけが変数に追加されます。COALESCEと共に使用された場合、Order byによって代入が影響を受ける場合

なぜクエリ2のOrder By節を追加すると、クエリ1と異なる結果になるのですか?

[結果1]

ボール1、ボール2、バット3、バット1、バット2

[結果2]

バット1

JSフィドルリンク:http://sqlfiddle.com/#!6/8dad1/15

[SQLフィドル] [1]

MS SQL Serverの2014スキーマのセットアップ

CREATE TABLE tbl_Trans 
([Id] int, [Instrument] varchar(20), [Trans_Type] int, [Quantity] int); 

CREATE TABLE tbl_Trans_Type 
([Id] int, [Trans_Type] varchar(20)); 

INSERT INTO tbl_Trans ([Id], [Instrument], [Trans_Type], [Quantity]) 

VALUES 
(1,'Ball 1', 121, 50), 
(2,'Ball 2', 121, 20), 
(3,'Bat 3', 122, 1000), 
(4,'Bat 1', 124, 400), 
(5,'Bat 2', 121, 300); 


INSERT INTO tbl_Trans_Type ([Id], [Trans_Type]) 

VALUES 
(121,'Buy'), 
(122,'Sell'), 
(123,'ReSell'), 
(124,'Rent') 

**Query 1**: 

DECLARE @ST VARCHAR(500) = NULL 
SELECT @ST = COALESCE(@ST+ ',' , '')+Instrument 
FROM tbl_Trans a 
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 

SELECT @ST 

[結果1]

| Ball 1,Ball 2,Bat 3,Bat 1,Bat 2 | 

クエリ2

DECLARE @ST2 VARCHAR(500) = NULL 
SELECT @ST2 = COALESCE(@ST2+ ',' , '')+Instrument 
FROM tbl_Trans a 
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 
ORDER BY IIF(b.Trans_Type='Buy',1,2) 

SELECT @ST2 

[結果2]

| Bat 1 | 
+0

を行の変換が成功のために次のクエリを使用します。私はそれが*間違ったドキュメントにあると思うと頻繁に述べてきましたが、それはそこにありました。 SELECTリスト内のすべての式(代入を含む)が**出力行ごとに**正確に1回**実行されることは保証されていないためです" –

答えて

0

Tあなたが見ている行動は設計通りです。 ORDER BY句を使用した問合せでの代入操作(このシナリオでは連結)を使用すると、未定義の動作が発生します。

は、[ドキュメントでこれをやろうとの警告](https://docs.microsoftがあり句

順にカンマ区切りに
select stuff((select ','+Instrument 
FROM tbl_Trans a 
    LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id 
ORDER BY IIF(b.Trans_Type='Buy',1,2) 
for xml path('')) ,1,1,'') 
+0

" ORDER BY "がなくても定義されていないことが書かれています。 –

+0

NandishとDamien-The-Unbelieverを助けてくれてありがとう。私はこの行動について本当に混乱していました。 –

0

あなたがたが順序で連結したい場合は、これを試してみてください:

SELECT STUFF 
(
    (
     SELECT ',' +Instrument 
     FROM tbl_Trans a 
     LEFT JOIN tbl_Trans_Type b 
      on a.Trans_Type = b.Id 
     ORDER BY IIF(b.Trans_Type='Buy',1,2) 
     FOR XML PATH(''), TYPE 
    ).value('.', 'VARCHAR(MAX)') 
    ,1 
    ,1 
    ,'' 
); 
関連する問題