在 SQL 服务器查询中使用 Union 时出错

Error while using Union in SQL Server query

我正在尝试合并来自 2 个视图的相同信息,并且两个查询分别产生结果。但是,一旦我使用 Union 将它们组合起来,就会出现错误:

Error converting data type varchar to bigint.

我也尝试过为 table 名称使用别名,但它显示相同的错误。

这是我的查询

SELECT DISTINCT
       syn.sourcename,
       syn.propertyname,
       syn.IATA,
       syn.iataagencyname,
       syn.iataagencyaffiliation,
       syn.nightsstayed,
       syn.reservationstatus,
       syn.departuredate,
       syn.reservationroomrate
FROM dbo.vwIATAfactreservationSynXis syn
WHERE syn.reservationstatus != 'C'
  AND syn.departuredate >= CONVERT(datetime, '01/01/2020')
  AND syn.departuredate <= CONVERT(datetime, GETDATE())
UNION
SELECT DISTINCT
       ws.sourcename,
       ws.propertyname,
       ws.IATA,
       ws.iataagencyname,
       ws.iataagencyaffiliation,
       ws.nightsstayed,
       ws.reservationstatus,
       ws.departuredate,
       ws.reservationroomrate
FROM dbo.vwIATAfactreservationSHR ws
WHERE ws.reservationstatus != 'C'
  AND ws.departuredate >= CONVERT(datetime, '01/01/2020')
  AND ws.departuredate <= CONVERT(datetime, GETDATE());

尝试将两个 select 语句中的字段逐一转换为字符串,以找到造成问题的字段,如下例所示:

SELECT DISTINCT
       cast(syn.sourcename as nvarchar(max)),
       syn.propertyname,
       syn.IATA,
       syn.iataagencyname,
       syn.iataagencyaffiliation,
       syn.nightsstayed,
       syn.reservationstatus,
       syn.departuredate,
       syn.reservationroomrate
FROM dbo.vwIATAfactreservationSynXis syn
WHERE syn.reservationstatus != 'C'
  AND syn.departuredate >= CONVERT(datetime, '01/01/2020')
  AND syn.departuredate <= CONVERT(datetime, GETDATE())
UNION
SELECT DISTINCT
       cast(syn.sourcename as nvarchar(max)),
       ws.propertyname,
       ws.IATA,
       ws.iataagencyname,
       ws.iataagencyaffiliation,
       ws.nightsstayed,
       ws.reservationstatus,
       ws.departuredate,
       ws.reservationroomrate
FROM dbo.vwIATAfactreservationSHR ws
WHERE ws.reservationstatus != 'C'
  AND ws.departuredate >= CONVERT(datetime, '01/01/2020')
  AND ws.departuredate <= CONVERT(datetime, GETDATE());

您需要找出哪些列不相同。 . .然后转换它们。为此,您可以使用 INFORMATION_SCHEMA.COLUMNS

select column_name, data_type, count(*)
from information_schema.columns c
where table_name in ('vwIATAfactreservationSynXis', 'vwIATAfactreservationSHR')
group by column_name, data_type
having count(*) <> 2
order by column_name;

这应该足够接近了(除非这两个视图有无数列在查询中没有提到)。如果有很多单例列,则过滤原始查询中使用的列。然后,任何具有不同类型的列 - 好吧,应该将整数转换为字符串。

如果您不想经历这些麻烦,您可以将两个子查询中的所有列——或所有可疑列——转换为字符串:

SELECT CONVERT(VARCHAR(255), syn.sourcename) as sourcename,
       CONVERT(VARCHAR(255), syn.propertyname) as proprtyname,
       . . .