不知大家是不是也碰到過把一個資料庫匯入到另外一個資料庫時,主鍵和自動遞增的屬性都消失了,在網上找到一遍圖解的正確匯入方法,分享。
SQL Server 匯入/匯出教程
1、開啟本地企業管理器,先建立一個SQL Server註冊來遠端連線伺服器連接埠SQL Server。
步驟如:
圖1:
2、快顯視窗後輸入內容。"總是提示輸入登陸名和密碼"可選可不選,2。
圖2:
3、註冊好伺服器後,點擊開啟。如果是選擇了"總是提示輸入登陸名和密碼"的話再點了確定後會提示輸入使用者密碼,3。
圖3:
4、進入後,選擇到您的資料庫,如testdb。在上面點右鍵,"所有任務">>"匯入資料",4。
圖4:
5、進入DTS匯入/匯出嚮導,點擊“下一步”按鈕繼續
圖5:
6、選擇資料來源,輸入資料來源所在的資料庫伺服器名稱、使用者名稱、密碼和要複製資料的來源資料庫,點擊“下一步”按鈕
圖6:
7、選擇“在SQL Server資料庫之間複製對象和資料”方式,點“下一步”繼續
圖7:
8、這一步可以把"包括擴充屬性"和"定序"兩個選擇上。接著去掉左下的"使用預設選項",點擊右下角的"選項"來進行配置。
圖8:
9、圖8中點"選項"後會彈出圖9,把"複製資料庫使用者和資料庫角色"與"複製對象級許可權"兩個選項去掉,
點確定回到圖8接著點"下一步"進到圖10。
圖9:
10、設定調度方式,一般選“立即運行”就可以,然後點“下一步”繼續
圖10:
11、點"完成"開始執行。
圖11:
12、進行中資料匯入中
圖12:
13、如果一切正常,提示成功複製13,那就大功告成了。
圖13:
SQL Server 匯入/匯出 錯誤排查
如果提示匯入失敗,出現圖14情況,這時不要急著點"完成"關閉視窗。雙擊中間的"出現錯誤"會出現詳細的失敗原因。
圖14:
錯誤原因一、沒安裝SP3補丁
如果是出現15的報錯原因,那麼就很有可能是因為您原生SQL Server還沒有打SP3補丁。
圖15:
如何查看是否已打了SP3補丁呢?右鍵點擊本地SQL Server屬性,彈出圖16視窗,查看"產品版本"一行。
像以顯示8.00.760(SP3)說明已經打過補丁。如果您的企業管理器顯示的版本要比這個小,那就是沒打SP3補丁。
請安裝SQL Server SP3補丁後再重試。
圖16:
錯誤原因二、對象屬性衝突
如果出現圖17情況,那麼應該就是您本機資料庫的表/視圖/預存程序的屬主和伺服器上資料庫預設使用者不一致。
伺服器的使用者一般是:資料庫名+'_f',如我的資料庫名稱是testdb,則我在伺服器上使用的資料庫使用者名稱就是testdb_f。
18,我本地的表屬主是testuser,與伺服器資料庫使用者名稱不一致,因此匯入處理程序出錯。
圖17:
圖18:
解決方案是:
應該先把本地的所有表/視圖/預存程序屬主都改為dbo或testdb_f(後者需要在本地建立起相應使用者。
建議建立,否則以後想從伺服器上匯出資料時同樣會因為這個問題匯出錯誤),再重新進行匯入/匯出。
開啟SQL查詢分析器,運行以下命令進行批量修改表屬主為dbo:
exec sp_MSForEachTable 'sp_changeobjectowner "?", "dbo"' |
運行成功後表屬主會改變成19:
圖19:
如果需要修改視圖/預存程序,則麻煩了點。
下面有個方法可以實現:
一、先在master建立一個sp_MSforeachObject預存程序,命令如下:
USE MASTER GO CREATE proc sp_MSforeachObject @objectType int=1, @command1 nvarchar(2000), @replacechar nchar(1) = N'?', @command2 nvarchar(2000) = null, @command3 nvarchar(2000) = null, @whereand nvarchar(2000) = null, @precommand nvarchar(2000) = null, @postcommand nvarchar(2000) = null as /* This proc returns one or more rows for each table (optionally, matching @where), with each table defaulting to its own result set */ /* @precommand and @postcommand may be used to force a single result set via a temp table. */ /* Preprocessor won't replace within quotes so have to use str(). */ declare @mscat nvarchar(12) select @mscat = ltrim(str(convert(int, 0x0002))) if (@precommand is not null) exec(@precommand) /* Defined @isobject for save object type */ Declare @isobject varchar(256) select @isobject= case @objectType when 1 then 'IsUserTable' when 2 then 'IsView' when 3 then 'IsTrigger' when 4 then 'IsProcedure' when 5 then 'IsDefault' when 6 then 'IsForeignKey' when 7 then 'IsScalarFunction' when 8 then 'IsInlineFunction' when 9 then 'IsPrimaryKey' when 10 then 'IsExtendedProc' when 11 then 'IsReplProc' when 12 then 'IsRule' end /* Create the select */ /* Use @isobject variable isstead of IsUserTable string */ EXEC(N'declare hCForEach cursor global for select ''['' + REPLACE(user_name(uid), N'']'', N'']]'') + '']'' + ''.'' + ''['' + REPLACE(object_name(id), N'']'', N'']]'') + '']'' from dbo.sysobjects o ' + N' where OBJECTPROPERTY(o.id, N'''+@isobject+''') = 1 '+N' and o.category & ' + @mscat + N' = 0 ' + @whereand) declare @retval int select @retval = @@error if (@retval = 0) exec @retval = sp_MSforeach_worker @command1, @replacechar, @command2, @command3 if (@retval = 0 and @postcommand is not null) exec(@postcommand) return @retval GO |
二、再運行以下命令批量修改表、觸發器、視圖、預存程序的屬主(需要先在master建立sp_MSforeachObject預存程序)
EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=1 EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=2 EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=3 EXEc sp_MSforeachObject @command1="sp_changeobjectowner '?', 'dbo'",@objectType=4 |
此時再重新進行匯入應該就能一切順利了。
原文地址:http://faq.gzidc.com/index.php?option=com_content&task=view&id=44&Itemid=43