0

在最近的一篇文章中,Sql server rtrim 不适合我,有什么建议吗?,我得到了一些很好的帮助,可以从选择查询中获取 csv 字符串。虽然它的行为出乎意料,但我找不到任何类似的示例或文档。该查询返回 802 条记录,但没有使用 coalesce 语句,作为普通选择。通过合并,我只返回 81。如果我输出到文本或输出到文件,我会得到相同的结果。此查询返回 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, '');

要确定字符串是否完整,请停止查看 Management Studio 中的输出。如果超过 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 回答