2016-07-07 39 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中的任何字符类型,你应该始终包括长度说明符。默认长度因上下文而异,如果默认值不够大,该错误可能很难追查到。