在 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,
. . .
我正在尝试合并来自 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,
. . .