Sql server 在T-SQL中是否有一种智能的方法来实现逻辑异或(两个请求之间的差异)
作为系统验证的一部分,我尝试比较两个查询之间的结果(下面是简化版本) 及 我想确保它们返回相同的结果,如果不是,我想显示它们以供分析Sql server 在T-SQL中是否有一种智能的方法来实现逻辑异或(两个请求之间的差异),sql-server,tsql,Sql Server,Tsql,作为系统验证的一部分,我尝试比较两个查询之间的结果(下面是简化版本) 及 我想确保它们返回相同的结果,如果不是,我想显示它们以供分析 ((REFERENCE QUERY) EXCEPT (DATA QUERY)) UNION ((DATA QUERY) EXCEPT (REFERENCE QUERY)) 由于我的流程在工具和自动化方面都很差,我主要是手工输入这些请求。我讨厌必须重新键入/复制粘贴查询两次,因为这很容易出错 因此,问题很简单:是否有一种简单的语法(或简单的工具)可以让我编写类
((REFERENCE QUERY)
EXCEPT
(DATA QUERY))
UNION
((DATA QUERY)
EXCEPT
(REFERENCE QUERY))
由于我的流程在工具和自动化方面都很差,我主要是手工输入这些请求。我讨厌必须重新键入/复制粘贴查询两次,因为这很容易出错
因此,问题很简单:是否有一种简单的语法(或简单的工具)可以让我编写类似于
(REFERENCE QUERY)
XOR
(DATA QUERY)
我找到了一种效果很好但仍然很重的黑客。有更好(写起来更简单)的吗
您可以使用CTE:
WITH ComplexQuery1(Col1, Col2) AS (
SELECT Col1, Col2
FROM ...
),
ComplexQuery2(Col1, Col2) AS (
SELECT Col1, Col2
FROM ...
),
Except1(Col1, Col2) AS(
SELECT * FROM ComplexQuery1
EXCEPT
SELECT * FROM ComplexQuery2
),
Except2(Col1, Col2) AS(
SELECT * FROM ComplexQuery2
EXCEPT
SELECT * FROM ComplexQuery1
)
SELECT * FROM Except1
UNION ALL
SELECT * FROM Except2;
据我所知,您需要显示实际查询未返回的任何预期结果以及实际查询未返回的任何结果 我将使用两个表,第一个表保存预期的数据并包含intrest所有列的校验和值,第二个表是实际系统上的查询结果,应该包含一个校验和列,该校验和列将在实际查询执行后更新 评估下面的示例,看看它是否适合您的需要
declare @lt_ExpectedResults table (lER_PersonName varchar(20), lER_PersonStuff varchar(20), lER_Chksum bigint)
Insert @lt_ExpectedResults (lER_PersonName, lER_PersonStuff)
Values
('Bubba1','Stuf1'),
('Bubba2','stuff2')
Update @lt_ExpectedResults set lER_Chksum = CHECKSUM(*)
declare @lt_ActualResults table (lAR_PersonName varchar(20), lAR_PersonStuff varchar(20), lAR_Chksum bigint)
Insert @lt_ActualResults (lAR_PersonName, lAR_PersonStuff)
Values
('Bubba1','Stuf1'),
('Bubba3','stuff2')
Update @lt_ActualResults set lAR_Chksum = CHECKSUM(*)
select * from @lt_ExpectedResults
select * from @lt_ActualResults
Select * from @lt_ExpectedResults
full outer join @lt_ActualResults
on lAR_Chksum = lER_Chksum
where lAR_Chksum is NULL or lER_Chksum is NULL
您应该知道,有时校验和值与不相同的源数据相同。查看StackOverflow和此链接以了解更多信息
I通常为完全外部连接。DBA站点上的相关问题
DECLARE @ShouldBeIncluded TABLE(Id INT); INSERT INTO @ShouldBeIncluded
SELECT p.Id, p.FullName
FROM Person p
WHERE ...
DECLARE @ActuallyIncluded TABLE(Id INT); INSERT INTO @ActuallyIncluded
SELECT p.Id, p.FullName
FROM Person p
RIGHT J
SELECT p.Id, p.FullName
FROM Person p
WHERE p.Id IN ( SELECT Id FROM @ActuallyIncluded
EXCEPT SELECT Id FROM @ShouldBeIncluded )
OR p.Id IN ( SELECT Id FROM @ShouldBeIncluded
EXCEPT SELECT Id FROM @ActuallyIncluded )
WITH ComplexQuery1(Col1, Col2) AS (
SELECT Col1, Col2
FROM ...
),
ComplexQuery2(Col1, Col2) AS (
SELECT Col1, Col2
FROM ...
),
Except1(Col1, Col2) AS(
SELECT * FROM ComplexQuery1
EXCEPT
SELECT * FROM ComplexQuery2
),
Except2(Col1, Col2) AS(
SELECT * FROM ComplexQuery2
EXCEPT
SELECT * FROM ComplexQuery1
)
SELECT * FROM Except1
UNION ALL
SELECT * FROM Except2;
declare @lt_ExpectedResults table (lER_PersonName varchar(20), lER_PersonStuff varchar(20), lER_Chksum bigint)
Insert @lt_ExpectedResults (lER_PersonName, lER_PersonStuff)
Values
('Bubba1','Stuf1'),
('Bubba2','stuff2')
Update @lt_ExpectedResults set lER_Chksum = CHECKSUM(*)
declare @lt_ActualResults table (lAR_PersonName varchar(20), lAR_PersonStuff varchar(20), lAR_Chksum bigint)
Insert @lt_ActualResults (lAR_PersonName, lAR_PersonStuff)
Values
('Bubba1','Stuf1'),
('Bubba3','stuff2')
Update @lt_ActualResults set lAR_Chksum = CHECKSUM(*)
select * from @lt_ExpectedResults
select * from @lt_ActualResults
Select * from @lt_ExpectedResults
full outer join @lt_ActualResults
on lAR_Chksum = lER_Chksum
where lAR_Chksum is NULL or lER_Chksum is NULL