0

最近の投稿で、Sql サーバーの rtrim が機能しない、提案はありますか? 、選択クエリからcsv文字列を取得するのに役立ちました。ただし、予期しない動作をしており、同様の例やドキュメントが見つかりません。クエリは、通常の選択として、合体ステートメントなしで 802 レコードを返します。テキストに出力したり、ファイルに出力したりしても、これと同じ結果が得られます。このクエリは 800 行以上を返します。

declare @maxDate date = (select MAX(TradeDate) from tblDailyPricingAndVol)

select p.Symbol, ','
from tblDailyPricingAndVol p
where p.Volume > 1000000 and p.Clse <= 40 and p.TradeDate = @maxDate
order by p.Symbol

しかし、これらの値を連結しようとすると、多くが欠落しています。

declare @maxDate date = (select MAX(TradeDate) from tblDailyPricingAndVol)

declare @str VARCHAR(MAX)

SELECT @str = COALESCE(@str+',' ,'') + LTRIM(RTRIM((p.Symbol)))
FROM tblDailyPricingAndVol p
WHERE p.Volume > 1000000 and p.Clse <= 40 and p.TradeDate = @maxDate
ORDER by p.Symbol
SELECT @str
4

1 に答える 1

2

これは正常に機能しているはずですが、これが私がそれを行う方法です:

DECLARE @str VARCHAR(MAX) = '';

SELECT @str += ',' + LTRIM(RTRIM(Symbol))
FROM dbo.tblDailyPricingAndVol
WHERE Volume > 1000000 AND Clse <= 40 AND radeDate = @maxDate
ORDER by Symbol;

SET @str = STUFF(@str, 1, 1, '');

文字列が完全であるかどうかを判断するには、ManagementStudioでの出力の確認を停止します。Management Studioが表示する文字数を超えると、これは常に切り捨てられます。いくつかのテストを実行して、変数全体を検査せずに変数をチェックできます。

A.個々のパーツのデータ長を結果のデータ長と比較します。

SELECT SUM(DATALENGTH(LTRIM(RTRIM(Symbol)))) FROM dbo.tblDailyPricingAndVol
  WHERE ...

-- concatenation query here

SELECT DATALENGTH(@str);

-- these should be equal or off by one.

B.変数の終わりをセットの最後の要素と比較します。

SELECT TOP 1 Symbol FROM dbo.tblDailyPricingAndVol
  WHERE ...
  ORDER BY Symbol DESC;

-- concatenation query here

SELECT RIGHT(@str, 20);

-- is the last element in the set represented at the end of the string?
于 2012-09-18T13:10:39.547 に答える