2016-12-15 8 views
0

以下の構文を理解しようとしています。私はこれにいくつかの助けを得ることはできますか?COALESCEの構文の理解

DECLARE @StringList VARCHAR(2500); 
SELECT COALESCE(@StringList + ',','') + CAST(apID as VARCHAR) AS ApIdList FROM testTable 

答えて

1

その結果、最初のパラメータが2番目のパラメータが返されますNULLある場合はVARCHAR

COALESCE チェックにtestTableからすべてのapIDを取得します。この行では@StringListは常にあるのでNULL

COALESCE(@StringList + ',','') 

等しく、NULL + ',' = NULLあなたは(''

その後empty string + CAST(apID as VARCHAR)空の文字列を取得し、

1

合体は、最初の非を返すapIDVARCHARとしてあなたが得ます指定された要素に含まれるnull要素-https://msdn.microsoft.com/en-us/library/ms190349.aspxを参照してください。

あなたのケースでは、@StringListがnullでない場合、testTableの各行のappIDの前にコンマが追加されます。

1

コードでは、ApIDがテーブルのすべての行の文字列として返されます。どうして? @StringListNULLなので、最初の式は''と評価され、2番目の式はテーブルの一部の行のApIdの文字列表現になります。

VARCHARへの変換について、私は注意します。これをしないでください!デフォルトの長さは文脈によって異なり、長さなしでは非常に難しいデバッグエラーを導入することができます。

関連表現がより一般的ですが、私は思う:

SELECT @StringList = COALESCE(@StringList + ',', '') + CAST(apID as VARCHAR(8000)) AS ApIdList 
FROM testTable; 

これは、文字列の連結を行い、そのapIDのすべての値がカンマ区切りの文字列に連結されます。

これは、結果セットをループして変数を割り当てることです。このタイプの変数の複数の行への割り当てはお勧めしません。 SQL Serverが実際に動作することは保証されているとは言えませんが(つまり、文書化された機能です)、実際にはすべてのバージョンで動作するようです。