【问题标题】:Union queries causing type conversion error联合查询导致类型转换错误
【发布时间】:2019-09-09 09:28:09
【问题描述】:

我正在尝试找出为什么我的联合查询给我类型转换错误

我正在尝试创建一个必须以多个联合查询似乎是最简单的选择的方式格式化的报告。 本质上,我想要一个显示键列的输出,然后是每一列的一行,以及该列的值,所以它看起来像这样:

Key1  Column1   Value
Key1  Column2   Value
Key2  Column1   Value
Key2  Column2   Value

我正在为大约 40 列执行此操作,所以它有很多选择语句。

我所有的选择语句的结构都相同:

SELECT tb1.Key AS 'Key', 'Column1' AS 'Column', tb1.Column1 AS 'Value'
union
SELECT tb1.Key AS 'Key', 'Column2' AS 'Column', tb1.Column2 AS 'Value'

单独运行所有查询时我没有问题,但是当我尝试运行所有查询时,我遇到了将各种字符串转换为 int 类型的问题。

为了尝试纠正这个问题,我尝试将每个“值”列转换为 NVARCHAR,但我仍然收到一些字符串正试图转换为 int 类型的错误,但我不确定为什么会这样.

【问题讨论】:

  • 问题在于查询本身和列类型,而不是UNION。转换为nvarchar 并不能解决任何问题,它试图掩盖实际问题,同时引入更严重的问题,如本地化问题——之后的日期是什么样的?数字?更糟糕的是,如果在视图中使用该查询,服务器将无法使用列上的任何索引
  • 请发布实际查询和表架构。问题是列类型,而不是UNION。您也在使用什么报告工具?也许最简单的方法就是让报表工具合并查询
  • PS UNION 执行昂贵的 DISTINCT 操作。如果您不想消除重复,请使用UNION ALL
  • 嗨@PanagiotisKanavos。该查询不会在视图中使用,所以我不必担心,它只需要以这种格式导出。列中没有日期,只有字符串和数字。我可能会误解 CAST 但如果我转换为 nvarchar 为什么它仍会尝试转换为 int?
  • 简单的答案是因为你错过了一个演员,或者没有用错什么。除此之外,谁能猜到?

标签: sql sql-server type-conversion union


【解决方案1】:

通常在执行UNION 时,结果集列的数据类型将由执行或返回行的第一个查询决定。因此,如果您不确定UNIONs 中的哪些查询返回数据,您应该明确地CAST 所有列。比如:

SELECT 
  CAST(tb1.Key AS INTEGER) AS 'Key', 
  CAST('Column1' AS VARCHAR(100)) AS 'Column', 
  CAST(tb1.Column1 AS VARCHAR(100)) AS 'Value'
FROM MyTableA AS tb1

UNION

SELECT 
  CAST(tb1.Key AS INTEGER) AS 'Key', 
  CAST('Column1' AS VARCHAR(100)) AS 'Column', 
  CAST(tb1.Column1 AS VARCHAR(100)) AS 'Value'
FROM MyTableB AS tb1

如果您的UNIONs 是来自同一张表的简单SELECTs,那应该不是问题。但是当某些行返回 NULL 值并且数据类型可能不是您所期望的时,可能会出现问题。

【讨论】:

    【解决方案2】:

    问题是union 的列必须是同一类型。通常,您可以将值存储为字符串。

    更重要的是,您不需要union。 SQL Server 支持使用apply 关键字的横向连接。这更简单地表达为:

    select tb1.key, v.column, v.value
    from tb1 cross apply
         (values ('Column1', convert(nvarchar(max), tb1.Column1),
                 ('Column2', convert(nvarchar(max), tb1.Column2),
                 . . . 
         ) v(column, value);
    

    【讨论】:

      猜你喜欢
      • 2014-07-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2012-03-04
      • 2015-12-04
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      相关资源
      最近更新 更多