2016-07-07 28 views
0

我正在使用一些我在網站上找到的代碼,但我無法得到我的大腦。這個SQL COALESCE函數是如何工作的?

SELECT @cols = COALESCE (@cols + ',[' + CONVERT(NVARCHAR, [DATE], 106) + ']', 
      '[' + CONVERT(NVARCHAR, [DATE], 106) + ']') 
      FROM (SELECT DISTINCT [DATE] FROM #DailyReport) PV order by [DATE] 

它返回

[02 May 2016],[03 May 2016],[04 May 2016],[05 May 2016],[06 May 2016],[08 May 2016],[09 May 2016],[10 May 2016],[11 May 2016],[12 May 2016],[13 May 2016],[15 May 2016],[16 May 2016],[17 May 2016],[18 May 2016],[19 May 2016],[20 May 2016],[22 May 2016],[23 May 2016],[24 May 2016],[25 May 2016],[26 May 2016],[27 May 2016],[29 May 2016],[30 May 2016],[31 May 2016] 

但它是如何工作的?我希望我明白我是如何得到所有這些列以及爲什麼有兩個'['+ CONVERT(NVARCHAR,[DATE],106)+']'短語。

回答

2

您指出的兩個短語簡直就是如此coalesce()作品。有一種更簡單的方法來編寫邏輯。或許,這將有助於解釋發生了什麼:

SELECT @cols = COALESCE(@cols + ',', '') + '[' + CONVERT(NVARCHAR(255), [DATE], 106) + ']', 
FROM (SELECT DISTINCT [DATE] FROM #DailyReport 
    ) PV 
ORDER BY [DATE]; 

在你的情況下,全級聯是第一個參數COALESCE(),這樣的表達是需要作爲第一個參數。但是,如果這是NULL,那麼它又需要。

注:使用時使用VARCHAR()NVARCHAR()或SQL Server中的任何字符類型,你應該始終包括長度說明符。默認長度因上下文而異,如果默認值不夠大,該錯誤可能很難追查到。