Sql server 使用外键约束将表列表从一个表更新到另一个表
有没有办法创建动态SQL来将表从生产数据库更新到涉及外部约束的较低环境?现在我有以下几点,但我遇到了外键在不同环境中不同的问题:Sql server 使用外键约束将表列表从一个表更新到另一个表,sql-server,Sql Server,有没有办法创建动态SQL来将表从生产数据库更新到涉及外部约束的较低环境?现在我有以下几点,但我遇到了外键在不同环境中不同的问题: DECLARE @MyList TABLE (Value NVARCHAR(50)) INSERT INTO @MyList VALUES ('some_table') INSERT INTO @MyList VALUES ('some_table2') DECLARE @value VARCHAR(50) DECLARE @insert_cmd varchar(M
DECLARE @MyList TABLE (Value NVARCHAR(50))
INSERT INTO @MyList VALUES ('some_table')
INSERT INTO @MyList VALUES ('some_table2')
DECLARE @value VARCHAR(50)
DECLARE @insert_cmd varchar(MAX), @del_cmd NVARCHAR(MAX)
DECLARE db_cursor CURSOR FOR
SELECT Value FROM @MyList
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @value
WHILE @@FETCH_STATUS = 0
BEGIN
IF OBJECT_ID('Staging.dbo.'+@value) IS NOT NULL
BEGIN
SET @del_cmd = N'DROP TABLE Staging.dbo.'+@value+';';
--EXEC sp_executesql @del_cmd;
print @del_cmd
END
SET @insert_cmd = 'select * into Staging.dbo.'+@value+' from prod.dbo.'+@value+';'
--EXEC (@insert_cmd)
print @insert_cmd
FETCH NEXT FROM db_cursor INTO @value
END
CLOSE db_cursor
DEALLOCATE db_cursor
尝试以下操作:首先复制模式,然后禁用所有约束,然后复制数据。在数据复制完成后启用约束
DECLARE @MyList TABLE (Value NVARCHAR(50))
INSERT INTO @MyList VALUES ('some_table')
INSERT INTO @MyList VALUES ('some_table2')
DECLARE @value VARCHAR(50)
DECLARE @insert_cmd varchar(MAX), @del_cmd NVARCHAR(MAX)
DECLARE db_cursor CURSOR FOR
SELECT Value FROM @MyList
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @value
WHILE @@FETCH_STATUS = 0
BEGIN
IF OBJECT_ID('Staging.dbo.'+@value) IS NOT NULL
BEGIN
SET @del_cmd = N'DROP TABLE Staging.dbo.'+@value+';';
--EXEC sp_executesql @del_cmd;
print @del_cmd
END
SET @insert_cmd = 'select * into Staging.dbo.'+@value+' from prod.dbo.'+@value+' where 1<>1;
ALTER TABLE Staging.dbo.'+@value+' NOCHECK CONSTRAINT ALL;
insert into Staging.dbo.'+@value+' select * from prod.dbo.'+@value+';
ALTER TABLE Staging.dbo.'+@value+' CHECK CONSTRAINT ALL;'
--EXEC (@insert_cmd)
print @insert_cmd
FETCH NEXT FROM db_cursor INTO @value
END
CLOSE db_cursor
DEALLOCATE db_cursor
DECLARE@MyList表(值NVARCHAR(50))
插入@MyList值('some_table')中
插入@MyList值('some_table2')
声明@value VARCHAR(50)
声明@insert\U cmd varchar(最大值),@del\U cmd NVARCHAR(最大值)
声明的db_游标
从@MyList中选择值
打开db_光标
从db_游标获取下一个到@value
而@@FETCH\u STATUS=0
开始
如果对象ID('Staging.dbo.+@value)不为空
开始
设置@del_cmd=N'DROP TABLE Staging.dbo.++@value++;';
--EXEC sp_executesql@del_cmd;
打印@del_cmd
结束
SET@insert_cmd='select*进入Staging.dbo.+@value+'来自prod.dbo.+@value+'其中11;
altertablestaging.dbo.'+@value+'NOCHECK约束ALL;
插入到Staging.dbo中。“++@value++”从prod.dbo中选择*。“++@value++”;
ALTER TABLE Staging.dbo.'+@value+'检查约束ALL;'
--EXEC(@insert\u cmd)
打印@insert\u cmd
从db_游标获取下一个到@value
结束
关闭db_光标
取消分配db_游标
有办法吗?当然可以。基于您的DDL,这是困难的还是不可能的?也许。您必须根据自然密钥在两个数据库之间转换ID。如果您尚未定义自然关键点,那么从逻辑上讲,这是不可能的,尽管您可以基于各种假设强制进行转换。