質問

レコードを取り出し、それぞれを文字列に連結して、その文字列を出力することになっている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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top