我们有一个17存储系统,在server 2005标准版和Windows 2003服务器上。我们目前有以下程序:
我们希望做以下工作:
由于Server 2005,我们不能使用MERGE命令,而且由于表被截断和插入,所以不能很好地进行复制。我们怎么才能把钱换回内政部呢?
谢谢你,希伦·帕特尔
发布于 2015-12-29 19:27:01
我会将这个过程更改为更类似于以下内容。这不是最好的解决方案,但一开始并没有那么多好的选择。
导入数据进程: a) -删除昨天的表b) -将当前表重命名为*_yesterday c) -从系统导入到当前
在Store的Server中创建视图,该视图只返回当前表和_昨天表之间新的/不同的行。就像下面这样。
SELECT Current.*
FROM Current
LEFT OUTER JOIN Yesterday ON Yesterday.PK = Current.PK (or list each field out seperately)
WHERE Yesterday.PK IS NULL (so the new ones)
OR ISNULL(Yesterday.Field1, '') <> ISNULL(Current.Field1, '')
<repeat>
2) -将数据移动到HQ )--使用创建的视图,只需跨越新记录(可能进入暂存表)。那就用合并?( HQ是SQL的更高版本吗?)将新更新的数据推入总部的数据副本。
发布于 2015-12-29 19:41:36
假设可以对所涉及的源表进行更改,则可能需要考虑向每个源表添加一个TIMESTAMP
列,并使用该列跟踪已更改的行。每当任何列被修改时,服务器都会自动更新TIMESTAMP
列。
举个例子:
USE tempdb;
DROP TABLE dbo.T1;
CREATE TABLE dbo.T1
(
T1_ID INT NOT NULL
CONSTRAINT PK_T1
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
, SomeData VARCHAR(255)
, T1_TS TIMESTAMP NOT NULL
);
INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 1');
INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 2');
INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 3');
INSERT INTO dbo.T1 (SomeData)
VALUES ('This is a test 4');
SELECT *
FROM dbo.T1
CREATE TABLE dbo.T1_MergedRows
(
T1_ID INT NOT NULL
, T1_TS VARBINARY(8) NOT NULL
);
SELECT *
FROM dbo.T1
WHERE NOT EXISTS (
SELECT *
FROM dbo.T1_MergedRows t1m
WHERE t1m.T1_TS = t1.T1_TS
);
UPDATE dbo.T1_MergedRows
SET T1_TS = T1.T1_TS
FROM dbo.T1_MergedRows t1m
INNER JOIN dbo.T1 ON t1m.T1_ID = t1.T1_ID
WHERE t1m.T1_TS <> T1.T1_TS;
INSERT INTO dbo.T1_MergedRows (T1_ID, T1_TS)
SELECT t1.T1_ID
, t1.T1_TS
FROM dbo.T1
WHERE NOT EXISTS (
SELECT *
FROM dbo.T1_MergedRows t1m
WHERE t1m.T1_TS = t1.T1_TS
);
SELECT *
FROM dbo.T1
WHERE NOT EXISTS (
SELECT *
FROM dbo.T1_MergedRows t1m
WHERE t1m.T1_TS = t1.T1_TS
);
UPDATE dbo.T1
SET SomeData = 'This is not a test'
WHERE T1.T1_ID = 3;
SELECT *
FROM dbo.T1
WHERE NOT EXISTS (
SELECT *
FROM dbo.T1_MergedRows t1m
WHERE t1m.T1_TS = t1.T1_TS
);
以上4条SELECT
语句的结果如下:
正如您在上面的图像中所看到的,最后一个select语句只返回已修改的行。所以这方面的工作流程是:
SELECT * FROM dbo.T1 WHERE NOT EXISTS ( SELECT * FROM dbo.T1_MergedRows t1m WHERE t1m.T1_TS = t1.T1_TS );
T1_MergedRows
表:UPDATE dbo.T1_MergedRows SET T1_TS = T1.T1_TS FROM dbo.T1_MergedRows t1m INNER JOIN dbo.T1 ON t1m.T1_ID = t1.T1_ID WHERE t1m.T1_TS <> T1.T1_TS;
INSERT INTO dbo.T1_MergedRows (T1_ID, T1_TS) SELECT t1.T1_ID , t1.T1_TS FROM dbo.T1 WHERE NOT EXISTS ( SELECT * FROM dbo.T1_MergedRows t1m WHERE t1m.T1_TS = t1.T1_TS );
如果需要跟踪删除,可以修改T1_MergedRows
表以包含IsDeleted
位列,然后在导入行的过程中检查该列。在上面的步骤3中,您将更新T1_MergedRows
表以设置IsDeleted
位,如下所示:
UPDATE dbo.T1_MergedRows
SET IsDeleted = 1
WHERE NOT EXISTS (
SELECT 1
FROM dbo.T1
WHERE T1.T1_ID = T1_MergedRows.T1_ID
);
通过查看以下内容,夜间导入过程可以“查看”删除了哪些行:
SELECT *
FROM dbo.T1_MergedRows
WHERE IsDeleted = 1;
https://dba.stackexchange.com/questions/124799
复制相似问题