2017-03-12 4 views
0
DECLARE @EmployeeIds VARCHAR(200) 

SELECT @EmployeeIds = ISNULL (@EmployeeIds + ',', '') + CAST(ID AS VARCHAR(5)) 
FROM tblEmployee 
WHERE Gender = 'Male' 

PRINT @EmployeeIds 

1,3,4,5,6,9,10をどのように入手できましたか?我々は配列として答えを得た方法SQL文がこの回答をどのように返しているかわかりません

1 
3 
4 
5 
6 
9 
10 
+0

あなたは何をしようとしていますか?それは何を返すと思いますか? – Soviut

答えて

4

:私たちは、このような配列とではないとの回答を得た方法ここでは意味ですか?

これは配列ではありません。コンマで区切られた文字列です。変数@EmployeeIdsに複数回割り当てて生成されました。 tblEmployeeの各行に対して1回、WHERE句と一致するものが1回あります。

@EmployeeIdsは、最初はnullです。最初の行が発生した最初の行の後1で1

@EmployeeIds= ISNULL (@EmployeeIds + ',', '') + CAST(ID AS VARCHAR(5)) 
≡ @EmployeeIds= ISNULL (NULL + ',', '') + '1' /*Substituting in variable and column values*/ 
≡ @EmployeeIds= ISNULL (NULL, '') + '1' 
≡ @EmployeeIds= '' + '1' 

だから@EmployeeIdsのIDを有しています。

2行目処理等ID3

@EmployeeIds= ISNULL (@EmployeeIds + ',', '') + CAST(ID AS VARCHAR(5)) 
≡ @EmployeeIds= ISNULL ('1' + ',', '') + '3' /*Substituting in variable and column values*/ 
≡ @EmployeeIds= ('1' + ',') + '3' 
≡ @EmployeeIds= '1,3' 

とを有しています。これは、文字列連結への保証されたアプローチではありません。それは失敗する可能性があり、失敗し、特にマイクロソフトから警告されています。

Some example warnings

将来のバージョンでは、STRING_AGG機能が含まれます。今のところ最良の選択肢はXML PATH

+0

ありがとうございます。よく説明されています! – sek

関連する問題