这是我在工作中一直试图解决的问题。我不是数据库专家,所以也许这有点二年级。所有道歉。
我有一个给定的数据库D,它已经在另一台机器上复制(可能是一种可疑的方式),导致数据库D'。我的任务是检查数据库D和D'实际上完全相同。
当然,问题是,如果不是,那么实际应该做些什么。为此,我的想法是在每个相应的表上运行对称差异并查看差异。
有一个“大”数量的表,所以我不希望手动运行每个对称差异。然后,我如何实现可以在任意表上运行的对称差异“函数”(或存储过程,或任何你想要的),而不必显式枚举列?
这是在Windows上运行的,如果您没有遵循,您的对冲基金将会爆炸。祝你好运。
答案 0 :(得分:3)
你可以通过这样做来实现这一点。
我使用了一个函数将逗号分隔值拆分为一个表来进行说明。
CREATE FUNCTION [dbo].[Split]
(
@RowData nvarchar(2000),
@SplitOn nvarchar(5)
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Data nvarchar(100)
)
AS
BEGIN
Declare @Cnt int
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
GO
DECLARE @WB_LIST varchar(1024) = '123,125,764,256,157';
DECLARE @WB_LIST_IN_DB varchar(1024) = '123,125,795,256,157,789';
DECLARE @TABLE_UPDATE_LIST_IN_DB TABLE ( id varchar(20));
DECLARE @TABLE_UPDATE_LIST TABLE ( id varchar(20));
INSERT INTO @TABLE_UPDATE_LIST
SELECT data FROM dbo.Split(@WB_LIST,',');
INSERT INTO @TABLE_UPDATE_LIST_IN_DB
SELECT data FROM dbo.Split(@LIST_IN_DB,',');
SELECT * FROM @TABLE_UPDATE_LIST
EXCEPT
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB
UNION
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB
EXCEPT
SELECT * FROM @TABLE_UPDATE_LIST;
答案 1 :(得分:2)
这是解决方案。示例数据来自SSRS 2008 R2附带的ReportServer数据库,但您可以在任何数据集上使用它:
SELECT s.name, s.type
FROM
(
SELECT s1.name, s1.type
FROM syscolumns s1
WHERE object_name(s1.id) = 'executionlog2'
UNION ALL
SELECT s2.name, s2.type
FROM syscolumns s2
WHERE object_name(s2.id) = 'executionlog3'
) AS s
GROUP BY s.name, s.type
HAVING COUNT(s.name) = 1
答案 2 :(得分:1)
我的第一反应是建议以不可疑的方式再次复制到另一台机器。
如果这不是一个选项,也许Red Gate提供的某些工具可以满足您的需求。
(我绝不会对Red Gate感到满意,只记得Joel提到他们的工具在播客上有多好。)
答案 3 :(得分:1)
SQL Server 2000添加了“EXCEPT”关键字,这与Oracle的“减号”几乎完全相同
SELECT * FROM TBL_A WHERE ...
EXCEPT
SELECT * FROM TBL_B WHERE ...
答案 4 :(得分:0)
使用Red Gate之前的SQL比较工具。它比较了scheamas,SQL Data Compare工具比较数据。我认为您可以为他们免费试用,但如果这是一个反复出现的问题,您也可以购买它们。可能有像这样的开源或免费工具,但你可能只是得到这个。