如何在SQL Server中正确实现引号?

时间:2016-11-03 19:51:14

标签: sql sql-server tsql reporting-services sql-server-2014

背景资料:

我有一个填充SSRS报告的存储过程。 SSRS报告以CSV格式运行并导出。然后将其作为文本文件打开,并通过3方供应商应用程序运行。

教科书的输出应如下所示:

    lid, status, i_flag,Count, pDate, iDate
    62558633,"Text Value","08/16",11,"08/16","08/16"
    78013526,"Text Value","",,"08/16""08/16"

我的结果如下:

    lid, status, i_flag,Count,pDate,iDate
    19007442,"'Dir,MgmtII'",'',2,'','02/16' 
    17343623,'Text','',0,'11/15','02/16'

现在我正在使用的代码是:

SELECT 
    quotename(isnull(i_flag,''''), '''') as i_flag,
    isnull(lid, 0) as lid,
    quotename(isnull(status,''''), '''') as status,
    isnull(Count, 0) as Count,
    quotename(isnull(p_Date,''''), '''') as p_Date,
    quotename(isnull(i_Date,''''), '''') as i_Date
FROM
    #Table 

关于我如何解决这个问题的任何想法。对此有点困惑。感谢。

1 个答案:

答案 0 :(得分:3)

如果我正确理解你的问题(我很可能不会),我想你想要:

SELECT 
    QUOTENAME(ISNULL(i_flag,''), '"') AS i_flag,
    ISNULL(lid, 0) AS lid,
    QUOTENAME(ISNULL([status],''), '"') AS [status],
    ISNULL([Count], 0) AS [Count],
    QUOTENAME(ISNULL(p_Date,''), '"') AS p_Date,
    QUOTENAME(ISNULL(i_Date,''), '"') AS i_Date
FROM
    #Table

听起来您希望在双引号"中包含以便导出为CSV的字段中包含一些值,此外,在某些情况下,这些字段中的值可能为NULL。

上面的建议通过首先使用ISNULL用空字符串替换任何NULL值然后使用QUOTENAME将结果值换成双引号来处理这个问题。

与您发布的代码的重要区别在于:

  • 使用ISNULL时,我将NULL替换为空字符串'',而不是包含单引号字符''''的字符串(字符串中的两个连续单引号表示转义的文字单引号引用字符)
  • 当使用QUOTENAME将值包装在双引号中时,我在第二个参数中指定包含双引号'"'的字符串,而不是包含单引号字符''''的字符串

我希望这有助于您 - 如果您仍然遇到问题,也许您可​​以提供#Table临时表中的一些示例行以及您希望从查询中获得的输出,以便人们可以帮助你。

顺便说一句,使用statuscount等SQL保留关键字作为列名或别名并不是一种好习惯,但如果必须,我建议附上它们在括号中(即[status])以便于阅读(特别是在SSMS或任何带有SQL语法高亮或颜色编码的IDE中),如上所述。