【问题标题】:concat column names with string inside a string将列名与字符串内的字符串连接起来
【发布时间】:2014-06-13 14:23:37
【问题描述】:

我正在尝试创建一个漂亮的列来显示,但我无法使用空格或连字符。我希望该列显示为

2014 年 6 月或 2014 年 6 月,但是当我尝试以正常方式插入时出现错误,因为查询已经在字符串中。

这是我遇到问题的部分:

(LEFT(DATENAME(month, leadtime),3) + " " + CONVERT(varchar, DATEPART(year, leadtime))) as leadmonth

这是上下文查询的其余部分:

set @query = 'SELECT name AS "Lead Source",' + @cols + '
from 
(
SELECT d.name, COUNT(u.lead_source_id) AS totalLeads, + "["+ (LEFT(DATENAME(month, leadtime),3) + " " + CONVERT(varchar, DATEPART(year, leadtime)))+"] as leadmonth" +
FROM DI_TrackingDB.dbo.userleads u
INNER JOIN GSPremiumServices.dbo.supplier_product_lead_source_def d ON d.lead_source_id = u.lead_source_id
WHERE vend_id = 355135
    AND u.lead_source_id IS NOT NULL
GROUP BY u.lead_source_id, d.name, DATENAME(month, leadtime), DATEPART(year, leadtime), Convert(varchar(7), leadtime, 126)
) x
pivot 
(
max(totalLeads)
for leadmonth in (' + @cols + ')
) p '

请记住,我正在设置@query,所以我已经在一个字符串中。 任何建议表示赞赏。

【问题讨论】:

    标签: sql sql-server-2005 concatenation


    【解决方案1】:

    答案很简单。不确定人们是否不太理解我最初的问题,但答案是在内弦的两侧使用两个'。以下是有效代码的最终版本。

    DECLARE @cols AS NVARCHAR(MAX),
            @query  AS NVARCHAR(MAX)
    
    SELECT @cols = STUFF((SELECT ',' + QUOTENAME(monthyear)
        FROM (SELECT DISTINCT (LEFT(DATENAME(MONTH, month_start),3)+ '-' + CONVERT(VARCHAR, DATEPART(YEAR, month_start))) AS monthyear, month_start
              FROM dbo.mo_vendor_month WITH(NOLOCK)
              WHERE vend_id = #arguments.prospectId#
              AND month_start >= '#startDate#'
             )alertsMonths
            ORDER BY month_start ASC
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
         ,1,1,'')
    
        SET @query = 'SELECT ' + @cols + '
        FROM 
        (
            SELECT total_unique_leads,(LEFT(DATENAME(MONTH, month_start),3)+ ''-'' + CONVERT(VARCHAR, DATEPART(YEAR, month_start))) AS monthyear
            FROM dbo.mo_vendor_month
            WHERE vend_id = #arguments.prospectId#
            AND month_start >= ''#startDate#''
            GROUP BY month_start, total_unique_leads
            ) x
            pivot 
            (
            max(total_unique_leads)
            FOR monthyear IN (' + @cols + ')
            ) p '
    
    EXECUTE(@query)
    

    【讨论】:

      【解决方案2】:

      只需在您正在构建的字段名称周围加上方括号,如下所示:

      "[" + (LEFT(DATENAME(month, leadtime),3) + " " + CONVERT(varchar, DATEPART(year, leadtime))) + "] as leadmonth"
      

      我也准备好处理任何可能出现的单引号或双引号(通过在构建字符串时根据需要转义它们)。除此之外,将字段名称括在方括号中允许您使用通常不允许在标识符名称中使用的字符。

      【讨论】:

      • 如果我还没有在字符串中,这似乎可以自行工作。但是将其添加到incorrect syntax near the keyword FROM 的完整查询结果中,我编辑了上面的帖子以反映更改。
      • 而不是执行@query,只需print 它,并将生成的消息复制到新窗口并确保您的字符串被正确转义 - 可能您的引号是罪魁祸首。 . 当我们在一个字符串中出现一个字符串时,会发生在我们所有人身上。并使用两个 ' 而不是 "。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-04
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多