SQL COALESCE 函数如何工作?

How does this SQL COALESCE Function Work?

我正在使用我在网站上找到的一些代码,但我无法理解这个问题。

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

它returns

  [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) +“]”短语。

您指出的两个短语非常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服务器中的任何字符类型时,您应该总是包含一个长度说明符.默认长度因上下文而异,如果默认长度不够大,则很难找到错误。