TSQL:如何从 T1.Field_A 中的 XML 信息和 T2.Field_A 中的 nvarchar 的两个表中获取 UNION 结果
TSQL: How to get a UNION result from two tables with XML information in T1.Field_A and nvarchar in T2.Field_A
我有两个来自不同来源的独立数据输入表(一个直接插入,一个通过 API)。我正在尝试使用 UNION 命令从这两个表中获取统一的元组列表。不幸的是,字段 SourceEventID 的信息具有不同的源类型:
在表 1 中,SourceEventID 的信息存储在字段 IncidentRequest_XML 中的 xml 内(类型=xml)。
在表 2 中,此数据字段存储为字符串 (type = nvarchar)。
我的问题是:
Is it possible to get the result by using the union command in a different way and if not, how is it possible to get the unified list out of the two tables with the told circumstances?
非常感谢!
我尝试使用 UNION 命令获取结果,但它告诉我如下:
The data type xml cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
SELECT
row_number() OVER (PARTITION BY A.SourceSystem ORDER BY Date) as Row,
IncidentRequest_XML.query('INCIDENT_REQUEST/SourceEventID') as SourceEventID,
'FOO' as Type
FROM dbo.Source_A
INNER JOIN dbo.ConfigTable C ON A.SourceSystem = C.SourceSystem
WHERE C.ReturnStatus = 1
UNION
SELECT
row_number() OVER (PARTITION BY B.SourceSystem ORDER BY Date) as Row,
SourceEventID,
'BAR' as Type
FROM dbo.Source_B
INNER JOIN dbo.ConfigTable C ON B.SourceSystem = C.SourceSystem
WHERE C.ReturnStatus = 1
我期望的是以下结果:
ROW SourceEventID Type
1 <SourceEventID>abc12345</SourceEventID> FOO
2 testcall123 BAR
如果您查看 预期结果 ,您会发现 XML 和字符串会混合在同一列中。这是不可能的...
您可以做的是使用 .value()
而不是 .query()
将 SourceEventId 读取为字符串:
IncidentRequest_XML.value('(INCIDENT_REQUEST/SourceEventID/text())[1]','nvarchar(100)') as SourceEventID
或者您可以使用强制转换,将 .query()
的结果转换为字符串:
CAST(IncidentRequest_XML.query('INCIDENT_REQUEST/SourceEventID') AS NVARCHAR(100)) as SourceEventID
提示:.query()
returns XML 类型的结果,它是 XQuery 表达式的结果。另一方面 .value()
只能处理单例值(因此我们需要 (blah)[1]
和特定类型。
我有两个来自不同来源的独立数据输入表(一个直接插入,一个通过 API)。我正在尝试使用 UNION 命令从这两个表中获取统一的元组列表。不幸的是,字段 SourceEventID 的信息具有不同的源类型:
在表 1 中,SourceEventID 的信息存储在字段 IncidentRequest_XML 中的 xml 内(类型=xml)。
在表 2 中,此数据字段存储为字符串 (type = nvarchar)。
我的问题是:
Is it possible to get the result by using the union command in a different way and if not, how is it possible to get the unified list out of the two tables with the told circumstances?
非常感谢!
我尝试使用 UNION 命令获取结果,但它告诉我如下:
The data type xml cannot be used as an operand to the UNION, INTERSECT or EXCEPT operators because it is not comparable.
SELECT
row_number() OVER (PARTITION BY A.SourceSystem ORDER BY Date) as Row,
IncidentRequest_XML.query('INCIDENT_REQUEST/SourceEventID') as SourceEventID,
'FOO' as Type
FROM dbo.Source_A
INNER JOIN dbo.ConfigTable C ON A.SourceSystem = C.SourceSystem
WHERE C.ReturnStatus = 1
UNION
SELECT
row_number() OVER (PARTITION BY B.SourceSystem ORDER BY Date) as Row,
SourceEventID,
'BAR' as Type
FROM dbo.Source_B
INNER JOIN dbo.ConfigTable C ON B.SourceSystem = C.SourceSystem
WHERE C.ReturnStatus = 1
我期望的是以下结果:
ROW SourceEventID Type
1 <SourceEventID>abc12345</SourceEventID> FOO
2 testcall123 BAR
如果您查看 预期结果 ,您会发现 XML 和字符串会混合在同一列中。这是不可能的...
您可以做的是使用 .value()
而不是 .query()
将 SourceEventId 读取为字符串:
IncidentRequest_XML.value('(INCIDENT_REQUEST/SourceEventID/text())[1]','nvarchar(100)') as SourceEventID
或者您可以使用强制转换,将 .query()
的结果转换为字符串:
CAST(IncidentRequest_XML.query('INCIDENT_REQUEST/SourceEventID') AS NVARCHAR(100)) as SourceEventID
提示:.query()
returns XML 类型的结果,它是 XQuery 表达式的结果。另一方面 .value()
只能处理单例值(因此我们需要 (blah)[1]
和特定类型。