Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用外键约束将表列表从一个表更新到另一个表_Sql Server - Fatal编程技术网

Sql server 使用外键约束将表列表从一个表更新到另一个表

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

有没有办法创建动态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(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。如果您尚未定义自然关键点,那么从逻辑上讲,这是不可能的,尽管您可以基于各种假设强制进行转换。