【问题标题】:T-SQL CTE + SELECT nested CASE WHEN + convert table's column in CSV returns errorT-SQL CTE + SELECT 嵌套 CASE WHEN + 在 CSV 中转换表的列返回错误
【发布时间】:2012-08-11 12:46:07
【问题描述】:

我有以下 SQL 语句:

WITH CTE(Col01,...,Col05) AS
(
    ...
)
SELECT   ....
        ,CASE ....
              WHEN ... THEN CASE ...
                                 WHEN 0 THEN ...
                                 ELSE (SELECT STUFF((SELECT ',' + CAST(Col002 AS NVARCHAR(10)) FROM TableOne WHERE Col05=CTE.Col05 FOR XML PATH('')),1, 1,''))
                            END
              WHEN ... THEN ...
              WHEN ... THEN ...
              ELSE ...
        END
        ,...
FROM TableOne 
CROSS APPLY CTE 
WHERE TableOne.Col01=CTE.Col01

我想从列表信息中返回 CSV 列表 - 当我单独执行时,这些语句可以正常工作,但是在上面的 sql 语句语法中,它会生成以下错误:

消息 245,第 16 级,状态 1,第 1 行
将 nvarchar 值 '101,102,103,108,109,110,112,113,114,115,116,117,118,119,120,121,122,126,130,135,164,165,218' 转换为数据类型 int 时转换失败。

如果我将语句替换为 '1' 或 1,它不会让我出错。为什么它试图将 CSV 列表转换为 int?

【问题讨论】:

  • 因为,在您发布的内容中我们看不到的地方,您会以某种方式期望 SQL Server 获取单个字符串值并决定查看其中,在每个逗号处拆分它,然后然后将其视为多个值?一个常见的罪魁祸首是将这样的字符串传递给IN()
  • 我不太清楚你的意思。我在 case 语句中有不同的返回值——有时是数字,有时是字符串,还有这个 csv 列表。我已经阅读了 select-case 语句中的 convert 和 cast ,但是将每个值转换为 nvarchar 并没有解决我的问题。为了本地化问题,您需要有关查询的哪些信息?

标签: xml tsql case common-table-expression


【解决方案1】:

非常抱歉,我没有提供有关查询的更多信息 - 现在我找到了导致问题的原因,我发现如果没有显示整个图片,很难找到它。

当我将所有可能的值转换为 nvarchar 时,问题已得到解决。出于某种原因,如果返回值之一是 int,SQL 服务器也会尝试将所有值转换为 int。

此链接有助于解决我的问题:

http://www.fmsinc.com/free/newtips/sql/sqltip10.asp

编辑:我想这是有道理的 - 你可以根据情况得到不同的结果 - when 语句,但它们应该是一种类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 2021-09-30
    • 1970-01-01
    • 2015-02-24
    • 2011-06-07
    • 2016-02-12
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多