-1

我已经从 SQL Server 2008 R2 中的 MS Access 中恢复了一个表。

MS Access 中的旧表使用具有复制类型整数的 PK(因此存在负值)

将表导入 SQL Server 2008 R2 后,我更改了整数标识列的 PK。

我现在要做的是制作一个脚本,该脚本将采用负 PK 的所有行,用新的 PK(自动编号)复制该行,并用新创建的 PK 更改其他表 FK(负值)的值(自动编号)。然后,最后,删除刚刚重复的 OLD 行。

谢谢您的帮助

这是表格的一个例子:

CREATE TABLE [dbo].[TESTCopy](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Field1] [nchar](10) NOT NULL,
[Field2] [nchar](10) NOT NULL,
[Field3] [nchar](10) NOT NULL,
CONSTRAINT [PK_TESTCopy] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
4

1 回答 1

0

您可以使用光标来执行此操作,但由于性能和其他问题,他们不赞成:

DECLARE @CurrentID INT
DECLARE @NewID INT
DECLARE @Field1 NCHAR(10)
DECLARE @Field2 NCHAR(10)
DECLARE @Field3 NCHAR(10)

DECLARE curUpdateKeys CURSOR FOR
                    SELECT ID, Field1, Field2, Field3
                    FROM dbo.TESTCopy
                    WHERE ID < 0

OPEN curUpdateKeys

FETCH NEXT FROM curUpdateKeys INTO @CurrentID, @Field1, @Field2, @Field3

WHILE @@FETCH_STATUS = 0
BEGIN

-- Add new record
    INSERT INTO dbo.TESTCopy
        (Field1, Field2, Field3)
    VALUES 
        (@Field1, @Field2, @Field3)
-- Capture new record ID
    SET @NewID = SCOPE_IDENTITY()


-- Update your foreign keyed tables with new record ID
-- Repeat for every table
    UPDATE dbo.FK_TABLES
        SET fkTESTCopyID = @NewID
    WHERE dbo.FK_TABLES.fkTESTCopyID = @CurrentID

-- Remove original row with negative record ID ID
    DELETE
    FROM dbo.TESTCopy
    WHERE ID = @CurrentID

    FETCH NEXT FROM curUpdateKeys INTO @CurrentID, @Field1, @Field2, @Field3
END

CLOSE curUpdateKeys
DEALLOCATE curUpdateKeys
于 2013-05-10T18:48:29.423 回答