T-SQL Whileループと連結
-
19-08-2019 - |
質問
レコードを取り出し、それぞれを文字列に連結して、その文字列を出力することになっているSQLクエリがあります。クエリの重要な部分は次のとおりです。
DECLARE @counter int;
SET @counter = 1;
DECLARE @tempID varchar(50);
SET @tempID = '';
DECLARE @tempCat varchar(255);
SET @tempCat = '';
DECLARE @tempCatString varchar(5000);
SET @tempCatString = '';
WHILE @counter <= @tempCount
BEGIN
SET @tempID = (
SELECT [Val]
FROM #vals
WHERE [ID] = @counter);
SET @tempCat = (SELECT [Description] FROM [Categories] WHERE [ID] = @tempID);
print @tempCat;
SET @tempCatString = @tempCatString + '<br/>' + @tempCat;
SET @counter = @counter + 1;
END
スクリプトが実行されると、@tempCatString
は常にnullとして出力されますが、@tempCat
は常に正しく出力されます。 Whileループ内で連結が機能しない理由はありますか? @counter
の増分は完全に機能するため、これは間違っているようです。それで、私が見逃している何かがありますか?
解決
動作するように見えますが、何らかの理由で@tempCatStringがnullであると思われるようです。これが、nullが他の何かに連結されたとしても常にnull値を取得している理由です。各変数でCOALESCE()
を試して<!> quotに設定することをお勧めします。 <!> quot; nullの場合。
他のヒント
これはより効率的です。...
select @tempCatString = @tempCatString + Coalesce(Description,'') + '<br/>' from Categories...
select @fn
また、連結の問題を修正するオプションとしてconcat_null_yields_nullを調べますが、そのルートは避けます
keithwarrenには同意しますが、クエリにORDER BY句を必ず追加する必要があります。そうすることで、値が連結される順序を正確に確認できます。
また、NULL値を ''に置き換えるCOALESCEは、空白行を効果的に生成します。それらが必要かどうかはわかりませんが、WHERE句でフィルタするだけでなく、...
最後に、興味のあるIDを含む一時テーブルが表示されます。このテーブルをJOINに含めるだけで、ソーステーブルをフィルタリングできます...
DELCARE @output VARCHAR(8000)
SET @output = ''
SELECT
@output = @output + [Categories].Description + '<br/>'
FROM
Categories
INNER JOIN
#vals
ON #vals.val = [Categories].ID
WHERE
[Categories].Description IS NOT NULL
ORDER BY
[Categories].Description
所属していません StackOverflow