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

次のスクリプトは、ソース DB から別の宛先 DB に多くのテーブルをコピーします。これらのテーブルの一部に自動インクリメント列があることを考慮して ください。 -データベース

于 2013-11-21T23:21:29.630 に答える
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

宛先テーブルが既に作成されている場合は、ID 挿入をオンに設定し、クエリを次のように変更します。

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 に答える