2012-09-18 83 views
0

在最近的一篇文章Sql server rtrim not working for me, suggestions?中,我得到了一些很好的帮助从选择查询中获取csv字符串。尽管如此,它的表现还是出乎意料,我也找不到任何类似的例子或文档。该查询返回802个没有coalesce语句的记录,作为正常选择。随着合并,我回来了只有81.如果我输出到文本或输出到文件,我会得到相同的结果。该查询返回800+行:COALESCE截断连接输出

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 

回答

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将显示的字符数,将被截断。您可以运行一些测试来检查变量而不检查整个变量:

答:比较各个部分的数据长度与结果的数据长度。

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? 
+0

由于XML可以设置为允许无限长,因此您还可以使用'select @str as for XML PATH'作为[processing-instruction(x)]。 (PI位是为了防止entitisation) –

+0

谢谢亚伦。虽然我得到了同样的问题......也许我的问题应该是“什么是将字符串转换为csv格式的最佳方式?”我选择“文件结果”,然后将其作为csv打开。它在Excel中打开,每个符号(记录)都在一列中,但列表仍然比预期的要短。 – StatsViaCsh

+0

对不起,我仍然不知道字符串是如何被截断的。 –