1

我想使用主键和所有其他键使用 SQL 查询将所有表从一个数据库移动到另一个数据库。我正在使用 SQL Server 2005,我得到了一个 SQL 查询来移动表,但键没有移动。

我的查询如下

set @cSQL='Select Name from SRCDB.sys.tables where Type=''U''' 

Insert into #TempTable
exec (@cSQL)

while((select count(tName) from #t1Table)>0)
begin
    select top 1 @cName=tName from #t1Table
    set @cSQL='Select * into NEWDB.dbo.'+@cName+' from   SRCDB.dbo.'+@cName +' where 1=2'
    exec(@cSQL)
    delete from #t1Table where tName=@cName
end

其中 SRCDB 是源数据库的名称, NEWDB 是目标数据库的名称

我怎样才能做到这一点..?

任何人都可以在这方面帮助我...

谢谢...

4

4 回答 4

1

以下 T-SQL 语句将所有表、主键和外键从一个数据库移动到另一个数据库。请注意,SELECT * INTO FROM ... WHERE 1 = 2 方法不会创建 COMPUTED 列和用户数据类型。还假设所有主键都是聚集的

--ROLLBACK
SET XACT_ABORT ON
BEGIN TRAN
DECLARE @dsql nvarchar(max) = N''
SELECT @dsql += ' SELECT * INTO NEWDB.dbo.' + name + ' FROM SRCDB.dbo. ' + name + ' WHERE 1 = 2'
FROM sys.tables
--PRINT @dsql
EXEC sp_executesql @dsql

SET @dsql = N''
;WITH cte AS
 (SELECT 1 AS orderForExec, table_name, column_name, constraint_name, ordinal_position, 
         'PRIMARY KEY' AS defConst, NULL AS refTable, NULL AS refCol
  FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE          
  WHERE OBJECTPROPERTY(OBJECT_ID(constraint_name), 'IsPrimaryKey') = 1    
  UNION ALL
  SELECT 2, t3.table_name, t3.column_name, t1.constraint_name, t3.ordinal_position,
          'FOREIGN KEY', t2.table_name, t2.column_name
  FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as t1
    JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE t2 ON t1 .UNIQUE_CONSTRAINT_NAME = t2.CONSTRAINT_NAME
    JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE t3 ON t1.CONSTRAINT_NAME = t3.CONSTRAINT_NAME
          AND t3.ordinal_position = t2.ordinal_position
    )
    SELECT @dsql += ' ALTER TABLE NEWDB.dbo.' + c1.table_name + 
           ' ADD CONSTRAINT ' + c1.constraint_name + ' ' + c1.defConst + ' (' +        
           STUFF((SELECT ',' + c2.column_name
                  FROM cte c2
                  WHERE c2.constraint_name = c1.constraint_name
                  ORDER BY c2.ordinal_position ASC
                  FOR XML PATH(''), TYPE
                  ).value('.', 'nvarchar(max)'), 1, 1, '') + ')' +
                  CASE WHEN defConst = 'FOREIGN KEY' THEN ' REFERENCES ' + c1.refTable + ' (' +
           STUFF((SELECT ',' + c2.refCol
                  FROM cte c2
                  WHERE c2.constraint_name = c1.constraint_name
                  ORDER BY c2.ordinal_position ASC
                  FOR XML PATH(''), TYPE
                  ).value('.', 'nvarchar(max)'), 1, 1, '') + ')' ELSE '' END 
    FROM (SELECT DISTINCT orderForExec, table_name, defConst, constraint_name, refTable FROM cte) AS c1
    ORDER BY orderForExec
    --PRINT @dsql
    EXEC sp_executesql @dsql
COMMIT TRAN
于 2013-11-03T10:06:47.477 回答
0

您可以生成源数据库的自定义脚本并运行目标数据库的脚本。

这是链接,稍微好一点[一] [2]

获取完整的表,然后delete根据要求对目标数据库执行查询

如果您想使用查询。我想这个链接会有所帮助

于 2013-11-01T11:04:00.597 回答
0
DECLARE @strSQL NVARCHAR(MAX)
DECLARE @Name VARCHAR(50)

SELECT Name into #TempTable FROM SRCDB.sys.tables WHERE Type='U'

WHILE((SELECT COUNT(Name) FROM #TempTable) > 0)
BEGIN
    SELECT TOP 1 @Name = Name FROM #TempTable
    SET @strSQL = 'SELECT * INTO NEWDB.dbo.[' + @Name + '] FROM   SRCDB.dbo.[' + @Name + ']'
    EXEC(@strSQL)

    DELETE FROM #TempTable WHERE Name = @Name
END

DROP TABLE #TempTable

如果您已经创建了目标表,则只需设置身份插入并更改查询,如下所示:

SET @strSQL = ' SET IDENTITY_INSERT NEWDB.dbo.[' + @Name + '] ON; ' +
              ' INSERT INTO NEWDB.dbo.[' + @Name + '] SELECT * FROM SRCDB.dbo.[' + @Name + ']' +
              ' SET IDENTITY_INSERT NEWDB.dbo.[' + @Name + '] OFF '

更新 :

如果您不想要记录并且只想创建包含所有关键约束的表,请检查此解决方案:

在 SQL Server 中,如何为给定表生成 CREATE TABLE 语句?

于 2013-11-01T11:11:21.577 回答
0

以下脚本将许多表从源数据库复制到另一个目标数据库,考虑到其中一些表具有自动增量列: http ://sqlhint.com/sqlserver/copy-tables-auto-increment-into-separate -数据库

于 2013-11-21T23:21:29.630 回答