2012-09-18 82 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

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