該篇博文轉載自: http://www.cnblogs.com/fishparadise/p/4592789.html
SQLServer提供了多種數據導出導入的工具和方法,在此,分享我實(shí)踐的經(jīng)驗(只涉及數據庫與Excel、數據庫與文本文件、數據庫與數據庫之間的導出導入)。
(一)數據庫與Excel
方法1:
使用數據庫客戶(hù)端(SSMS)的界面工具。右鍵選擇要導出數據的數據庫,選擇“任務(wù)”——“導出數據”,下圖1,按照向導一步一步操作即可。而導入則相反,導入時(shí),SQLServer會(huì )默認創(chuàng )建一張新表,字段名也默認跟導入的Excel標題一樣,并且會(huì )默認字段數據類(lèi)型等。當然在可以在向導進(jìn)行修改。需要注意的是如果標題不是英文而是中文,默認創(chuàng )建字段名也是中文,這將給后面數據更新操作帶來(lái)麻煩,所以最好還是以有意義的英文字段名。把數據導入后,再通過(guò)執行語(yǔ)句,把數據插入/更新到業(yè)務(wù)表。

figure-1:任務(wù)——導出數據
方法2:
從SQLServer2005開(kāi)始,可以直接在SSMS上查詢(xún)出來(lái)的結果復制,然后粘貼到Excel上,對于少量數據來(lái)說(shuō),是非??焖俜奖愕?,需要注意的是長(cháng)數字可能會(huì )變成科學(xué)記數法的形式,提前在Excel上指定列的格式為文本即可。
導入的話(huà),ctrl + c 復制Excel上的數據,然后在選擇相關(guān)表,編輯數據,把數據直接粘貼上去即可。但是不建議直接粘貼到業(yè)務(wù)表(如果表是空白沒(méi)有數據,并且字段順序對應,可以這樣操作),而是建議先粘貼到一個(gè)新建的中間表中,然后再通過(guò)語(yǔ)句,把數據插入/更新到業(yè)務(wù)表。
這種方法的導出導入,適合于少量的數據,如5000行以?xún)鹊挠涗?,大?000行以上就不建議了,速度較慢,如果數據過(guò)大,還一定成功。
(二)數據庫與文本文件、數據庫與數據庫
數據庫之間的數據遷移或導出導入其實(shí)是比較方便的,比如備份數據庫后,在新的機器上做恢復。但是需要注意的是SQL2008之前的版本的備份無(wú)法在SQL2012或以上版本上直接恢復的,而是通過(guò)中間的SQL2008做一個(gè)過(guò)渡,把舊版本的數據庫恢復到SQL2008,然后做備份,最后在SQL2012上恢復。
如果是新版本(下面以SQL2012為例)的備份文件恢復到舊版本(以SQL2008為例)上就比較麻煩了,一般是不支持新版本備份文件在舊版本中恢復的。只能通過(guò)編寫(xiě)腳本,把新版本的數據導入到舊版本中。
方法1:
首先推薦使用的是數據不落地的“鏈接服務(wù)器”。使用SQL2012的SSMS,同時(shí)連接到SQL2012和SQL2008的實(shí)例,通過(guò)編寫(xiě)腳本把SQL2012的數據導入到SQL2008中。兩個(gè)實(shí)例的可以通過(guò)鏈接服務(wù)器來(lái)連接。以下是設置步驟。

figure-2:新建鏈接服務(wù)器

figure-3:鏈接服務(wù)器和數據源

figure-4:認證

figure-5:創(chuàng )建成功后,可以直接瀏覽鏈接服務(wù)器的目錄,也可以使用語(yǔ)句查詢(xún)了。
也可以使用腳本來(lái)創(chuàng )建鏈接服務(wù)器。
- --創(chuàng )建鏈接服務(wù)器
- EXEC sp_addlinkedserver
- @server='LINKED_SERVER_TEST2',--被訪(fǎng)問(wèn)的服務(wù)器別名
- @srvproduct='',
- @provider='SQLOLEDB',
- @datasrc='192.168.88.6,11433'--數據源
- GO
- --創(chuàng )建登錄名和密碼
- EXEC sys.sp_addlinkedsrvlogin
- @rmtsrvname = 'LINKED_SERVER_TEST2', -- 被訪(fǎng)問(wèn)的服務(wù)器別名
- @useself = 'false',
- @locallogin = NULL,
- @rmtuser = 'sa', -- 數據源登錄名
- @rmtpassword = 'psd123456' -- 數據源登錄密碼
- GO
- --設置數據可以訪(fǎng)問(wèn)
- EXEC sys.sp_serveroption
- @server = 'LINKED_SERVER_TEST2',
- @optname = 'data access',
- @optvalue = N'true'
- GO
code-1:創(chuàng )建鏈接服務(wù)器的腳本
創(chuàng )建成功后,可以直接查詢(xún)數據。

figure-6:查詢(xún)鏈接服務(wù)器的數據
通過(guò)視圖sys.servers可以查詢(xún)所有服務(wù)器及相關(guān)的屬性。

figure-7:查詢(xún)所有鏈接服務(wù)器
在SSMS上或運行以下腳本可以刪除指定的鏈接服務(wù)器。
- --刪除鏈接服務(wù)器及所有登錄
- EXEC sys.sp_dropserver
- @server = 'LINKED_SERVER_TEST2',
- @droplogins = 'droplogins'
- GO
code-2:刪除鏈接服務(wù)器及所有登錄
詳細請參考:https://technet.microsoft.com/zh-cn/library/ff772782%28v=sql.105%29.aspx
方法2:
如果兩個(gè)實(shí)例不能連接,只能在SQL2012上導出數據,再到SQL2008上導入。SQLServer提供生成包含數據的腳本工具,下圖2。在第三步的“高級”選項里有一項“Types of data to scripts”有三個(gè)選擇:Data only,Schema and data,Schema only,分別是只生成數據、生成表(對象)和數據,表(對象)。還有生成腳本的版本“Script for Server Version”,下圖3。其他選項,按實(shí)際需要選擇。

figure-8:任務(wù)——生成腳本

figure-9:生成腳本的高級選項
也可以使用存儲過(guò)程生成包含數據的腳本。這里介紹一個(gè)別人已經(jīng)做寫(xiě)好存儲過(guò)程:sp_generate_inserts。運行之后,會(huì )按表每條記錄生成一條insert的語(yǔ)句
- CREATE PROC [dbo].[sp_generate_inserts]
- (
- @table_name VARCHAR(776) , -- The table/view for which the INSERT statements will be generated using the existing data
- @target_table VARCHAR(776) = NULL , -- Use this parameter to specify a different table name into which the data will be inserted
- @include_column_list BIT = 1 , -- Use this parameter to include/ommit column list in the generated INSERT statement
- @from VARCHAR(800) = NULL , -- Use this parameter to filter the rows based on a filter condition (using WHERE)
- @include_timestamp BIT = 0 , -- Specify 1 for this parameter, if you want to include the TIMESTAMP/ROWVERSION column's data in the INSERT statement
- @debug_mode BIT = 0 , -- If @debug_mode is set to 1, the SQL statements constructed by this procedure will be printed for later examination
- @owner VARCHAR(64) = NULL , -- Use this parameter if you are not the owner of the table
- @ommit_images BIT = 0 , -- Use this parameter to generate INSERT statements by omitting the 'image' columns
- @ommit_identity BIT = 1 , -- Use this parameter to ommit the identity columns
- @top INT = NULL , -- Use this parameter to generate INSERT statements only for the TOP n rows
- @cols_to_include VARCHAR(8000) = NULL , -- List of columns to be included in the INSERT statement
- @cols_to_exclude VARCHAR(8000) = NULL , -- List of columns to be excluded from the INSERT statement
- @disable_constraints BIT = 0 , -- When 1, disables foreign key constraints and enables them after the INSERT statements
- @ommit_computed_cols BIT = 1 -- When 1, computed columns will not be included in the INSERT statement
- )
- AS
- BEGIN
- /***********************************************************************************************************
- Procedure: sp_generate_inserts (Build 22)
- (Copyright ?2002 Narayana Vyas Kondreddi. All rights reserved.)
- Purpose: To generate INSERT statements from existing data.
- These INSERTS can be executed to regenerate the data at some other location.
- This procedure is also useful to create a database setup, where in you can
- script your data along with your table definitions.
- Written by: Narayana Vyas Kondreddi
- http://vyaskn.tripod.com
- Acknowledgements:
- Divya Kalra -- For beta testing
- Mark Charsley -- For reporting a problem with scripting uniqueidentifier columns with NULL values
- Artur Zeygman -- For helping me simplify a bit of code for handling non-dbo owned tables
- Joris Laperre -- For reporting a regression bug in handling text/ntext columns
- Tested on: SQL Server 7.0 and SQL Server 2000
- Date created: January 17th 2001 21:52 GMT
- Date modified: May 1st 2002 19:50 GMT
- Email: vyaskn@hotmail.com
- NOTE: This procedure may not work with tables with too many columns.
- Results can be unpredictable with huge text columns or SQL Server 2000's sql_variant data types
- Whenever possible, Use @include_column_list parameter to ommit column list in the INSERT statement, for better results
- IMPORTANT: This procedure is not tested with internation data (Extended characters or Unicode). If needed
- you might want to convert the datatypes of character variables in this procedure to their respective unicode counterparts
- like nchar and nvarchar
- Example 1: To generate INSERT statements for table 'titles':
- EXEC sp_generate_inserts 'titles'
- Example 2: To ommit the column list in the INSERT statement: (Column list is included by default)
- IMPORTANT: If you have too many columns, you are advised to ommit column list, as shown below,
- to avoid erroneous results
- EXEC sp_generate_inserts 'titles', @include_column_list = 0
- Example 3: To generate INSERT statements for 'titlesCopy' table from 'titles' table:
- EXEC sp_generate_inserts 'titles', 'titlesCopy'
- Example 4: To generate INSERT statements for 'titles' table for only those titles
- which contain the word 'Computer' in them:
- NOTE: Do not complicate the FROM or WHERE clause here. It's assumed that you are good with T-SQL if you are using this parameter
- EXEC sp_generate_inserts 'titles', @from = "from titles where title like '%Computer%'"
- Example 5: To specify that you want to include TIMESTAMP column's data as well in the INSERT statement:
- (By default TIMESTAMP column's data is not scripted)
- EXEC sp_generate_inserts 'titles', @include_timestamp = 1
- Example 6: To print the debug information:
- EXEC sp_generate_inserts 'titles', @debug_mode = 1
- Example 7: If you are not the owner of the table, use @owner parameter to specify the owner name
- To use this option, you must have SELECT permissions on that table
- EXEC sp_generate_inserts Nickstable, @owner = 'Nick'
- Example 8: To generate INSERT statements for the rest of the columns excluding images
- When using this otion, DO NOT set @include_column_list parameter to 0.
- EXEC sp_generate_inserts imgtable, @ommit_images = 1
- Example 9: To generate INSERT statements excluding (ommiting) IDENTITY columns:
- (By default IDENTITY columns are included in the INSERT statement)
- EXEC sp_generate_inserts mytable, @ommit_identity = 1
- Example 10: To generate INSERT statements for the TOP 10 rows in the table:
- EXEC sp_generate_inserts mytable, @top = 10
- Example 11: To generate INSERT statements with only those columns you want:
- EXEC sp_generate_inserts titles, @cols_to_include = "'title','title_id','au_id'"
- Example 12: To generate INSERT statements by omitting certain columns:
- EXEC sp_generate_inserts titles, @cols_to_exclude = "'title','title_id','au_id'"
- Example 13: To avoid checking the foreign key constraints while loading data with INSERT statements:
- EXEC sp_generate_inserts titles, @disable_constraints = 1
- Example 14: To exclude computed columns from the INSERT statement:
- EXEC sp_generate_inserts MyTable, @ommit_computed_cols = 1
- ***********************************************************************************************************/
- SET NOCOUNT ON
- --Making sure user only uses either @cols_to_include or @cols_to_exclude
- IF ( ( @cols_to_include IS NOT NULL )
- AND ( @cols_to_exclude IS NOT NULL )
- )
- BEGIN
- RAISERROR('Use either @cols_to_include or @cols_to_exclude. Do not use both the parameters at once',16,1)
- RETURN -1 --Failure. Reason: Both @cols_to_include and @cols_to_exclude parameters are specified
- END
- --Making sure the @cols_to_include and @cols_to_exclude parameters are receiving values in proper format
- IF ( ( @cols_to_include IS NOT NULL )
- AND ( PATINDEX('''%''', @cols_to_include) = 0 )
- )
- BEGIN
- RAISERROR('Invalid use of @cols_to_include property',16,1)
- PRINT 'Specify column names surrounded by single quotes and separated by commas'
- PRINT 'Eg: EXEC sp_generate_inserts titles, @cols_to_include = "''title_id'',''title''"'
- RETURN -1 --Failure. Reason: Invalid use of @cols_to_include property
- END
- IF ( ( @cols_to_exclude IS NOT NULL )
- AND ( PATINDEX('''%''', @cols_to_exclude) = 0 )
- )
- BEGIN
- RAISERROR('Invalid use of @cols_to_exclude property',16,1)
- PRINT 'Specify column names surrounded by single quotes and separated by commas'
- PRINT 'Eg: EXEC sp_generate_inserts titles, @cols_to_exclude = "''title_id'',''title''"'
- RETURN -1 --Failure. Reason: Invalid use of @cols_to_exclude property
- END
- --Checking to see if the database name is specified along wih the table name
- --Your database context should be local to the table for which you want to generate INSERT statements
- --specifying the database name is not allowed
- IF ( PARSENAME(@table_name, 3) ) IS NOT NULL
- BEGIN
- RAISERROR('Do not specify the database name. Be in the required database and just specify the table name.',16,1)
- RETURN -1 --Failure. Reason: Database name is specified along with the table name, which is not allowed
- END
- --Checking for the existence of 'user table' or 'view'
- --This procedure is not written to work on system tables
- --To script the data in system tables, just create a view on the system tables and script the view instead
- IF @owner IS NULL
- BEGIN
- IF ( ( OBJECT_ID(@table_name, 'U') IS NULL )
- AND ( OBJECT_ID(@table_name, 'V') IS NULL )
- )
- BEGIN
- RAISERROR('User table or view not found.',16,1)
- PRINT 'You may see this error, if you are not the owner of this table or view. In that case use @owner parameter to specify the owner name.'
- PRINT 'Make sure you have SELECT permission on that table or view.'
- RETURN -1 --Failure. Reason: There is no user table or view with this name
- END
- END
- ELSE
- BEGIN
- IF NOT EXISTS ( SELECT 1
- FROM INFORMATION_SCHEMA.TABLES
- WHERE TABLE_NAME = @table_name
- AND ( TABLE_TYPE = 'BASE TABLE'
- OR TABLE_TYPE = 'VIEW'
- )
- AND TABLE_SCHEMA = @owner )
- BEGIN
- RAISERROR('User table or view not found.',16,1)
- PRINT 'You may see this error, if you are not the owner of this table. In that case use @owner parameter to specify the owner name.'
- PRINT 'Make sure you have SELECT permission on that table or view.'
- RETURN -1 --Failure. Reason: There is no user table or view with this name
- END
- END
- --Variable declarations
- DECLARE @Column_ID INT ,
- @Column_List NVARCHAR(MAX) ,
- @Column_Name VARCHAR(128) ,
- @Start_Insert NVARCHAR(MAX) ,
- @Data_Type VARCHAR(128) ,
- @Actual_Values NVARCHAR(MAX) , --This is the string that will be finally executed to generate INSERT statements
- @IDN VARCHAR(128) --Will contain the IDENTITY column's name in the table
- --Variable Initialization
- SET @IDN = ''
- SET @Column_ID = 0
- SET @Column_Name = ''
- SET @Column_List = ''
- SET @Actual_Values = ''
- IF @owner IS NULL
- BEGIN
- SET @Start_Insert = 'INSERT INTO ' + '['
- + RTRIM(COALESCE(@target_table, @table_name)) + ']'
- END
- ELSE
- BEGIN
- SET @Start_Insert = 'INSERT ' + '[' + LTRIM(RTRIM(@owner))
- + '].' + '[' + RTRIM(COALESCE(@target_table, @table_name))
- + ']'
- END
- --To get the first column's ID
- SELECT @Column_ID = MIN(ORDINAL_POSITION)
- FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
- WHERE TABLE_NAME = @table_name
- AND ( @owner IS NULL
- OR TABLE_SCHEMA = @owner
- )
- --Loop through all the columns of the table, to get the column names and their data types
- WHILE @Column_ID IS NOT NULL
- BEGIN
- SELECT @Column_Name = QUOTENAME(COLUMN_NAME) ,
- @Data_Type = DATA_TYPE
- FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
- WHERE ORDINAL_POSITION = @Column_ID
- AND TABLE_NAME = @table_name
- AND ( @owner IS NULL
- OR TABLE_SCHEMA = @owner
- )
- IF @cols_to_include IS NOT NULL --Selecting only user specified columns
- BEGIN
- IF CHARINDEX('''' + SUBSTRING(@Column_Name, 2,
- LEN(@Column_Name) - 2)
- + '''', @cols_to_include) = 0
- BEGIN
- GOTO SKIP_LOOP
- END
- END
- IF @cols_to_exclude IS NOT NULL --Selecting only user specified columns
- BEGIN
- IF CHARINDEX('''' + SUBSTRING(@Column_Name, 2,
- LEN(@Column_Name) - 2)
- + '''', @cols_to_exclude) <> 0
- BEGIN
- GOTO SKIP_LOOP
- END
- END
- --Making sure to output SET IDENTITY_INSERT ON/OFF in case the table has an IDENTITY column
- IF ( SELECT COLUMNPROPERTY(OBJECT_ID(QUOTENAME(COALESCE(@owner,
- USER_NAME()))
- + '.' + @table_name),
- SUBSTRING(@Column_Name, 2,
- LEN(@Column_Name) - 2),
- 'IsIdentity')
- ) = 1
- BEGIN
- IF @ommit_identity = 0 --Determing whether to include or exclude the IDENTITY column
- SET @IDN = @Column_Name
- ELSE
- GOTO SKIP_LOOP
- END
- --Making sure whether to output computed columns or not
- IF @ommit_computed_cols = 1
- BEGIN
- IF ( SELECT COLUMNPROPERTY(OBJECT_ID(QUOTENAME(COALESCE(@owner,
- USER_NAME()))
- + '.'
- + @table_name),
- SUBSTRING(@Column_Name, 2,
- LEN(@Column_Name)
- - 2),
- 'IsComputed')
- ) = 1
- BEGIN
- GOTO SKIP_LOOP
- END
- END
- --Tables with columns of IMAGE data type are not supported for obvious reasons
- IF ( @Data_Type IN ( 'image' ) )
- BEGIN
- IF ( @ommit_images = 0 )
- BEGIN
- RAISERROR('Tables with image columns are not supported.',16,1)
- PRINT 'Use @ommit_images = 1 parameter to generate INSERTs for the rest of the columns.'
- PRINT 'DO NOT ommit Column List in the INSERT statements. If you ommit column list using @include_column_list=0, the generated INSERTs will fail.'
- RETURN -1 --Failure. Reason: There is a column with image data type
- END
- ELSE
- BEGIN
- GOTO SKIP_LOOP
- END
- END
- --Determining the data type of the column and depending on the data type, the VALUES part of
- --the INSERT statement is generated. Care is taken to handle columns with NULL values. Also
- --making sure, not to lose any data from flot, real, money, smallmomey, datetime columns
- SET @Actual_Values = @Actual_Values
- + CASE WHEN @Data_Type IN ( 'char', 'varchar', 'nchar','nvarchar' )
- THEN 'COALESCE(''N'''''' + REPLACE(RTRIM('
- + @Column_Name
- + '),'''''''','''''''''''')+'''''''',''NULL'')'
- WHEN @Data_Type IN ( 'datetime', 'smalldatetime',
- 'DATE','time' )
- THEN 'COALESCE('''''''' + RTRIM(CONVERT(char,'
- + @Column_Name + ',120))+'''''''',''NULL'')'
- WHEN @Data_Type IN ( 'uniqueidentifier' )
- THEN 'COALESCE('''''''' + REPLACE(CONVERT(char(255),RTRIM('
- + @Column_Name
- + ')),'''''''','''''''''''')+'''''''',''NULL'')'
- WHEN @Data_Type IN ( 'text', 'ntext' )
- THEN 'COALESCE(''N'''''' + REPLACE(CONVERT(char(8000),'
- + @Column_Name
- + '),'''''''','''''''''''')+'''''''',''NULL'')'
- WHEN @Data_Type IN ( 'binary', 'varbinary' )
- THEN 'COALESCE(RTRIM(CONVERT(char,'
- + 'CONVERT(int,' + @Column_Name
- + '))),''NULL'')'
- WHEN @Data_Type IN ( 'timestamp', 'rowversion' )
- THEN CASE WHEN @include_timestamp = 0
- THEN '''DEFAULT'''
- ELSE 'COALESCE(RTRIM(CONVERT(char,'
- + 'CONVERT(int,' + @Column_Name
- + '))),''NULL'')'
- END
- WHEN @Data_Type IN ( 'hierarchyid' )
- THEN 'COALESCE(''CAST(''''''+LTRIM(RTRIM('
- + 'CONVERT(char, ' + @Column_Name + ')'
- + ')),''NULL'')' + '+''''''AS hierarchyid)'''
- WHEN @Data_Type IN ( 'float', 'real', 'money',
- 'smallmoney' )
- THEN 'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, '
- + @Column_Name + ',2)' + ')),''NULL'')'
- ELSE 'COALESCE(LTRIM(RTRIM(' + 'CONVERT(char, '
- + @Column_Name + ')' + ')),''NULL'')'
- END + '+' + ''',''' + ' + '
- --Generating the column list for the INSERT statement
- SET @Column_List = @Column_List + @Column_Name + ','
- SKIP_LOOP: --The label used in GOTO
- SELECT @Column_ID = MIN(ORDINAL_POSITION)
- FROM INFORMATION_SCHEMA.COLUMNS (NOLOCK)
- WHERE TABLE_NAME = @table_name
- AND ORDINAL_POSITION > @Column_ID
- AND ( @owner IS NULL
- OR TABLE_SCHEMA = @owner
- )
- --Loop ends here!
- END
- --To get rid of the extra characters that got concatenated during the last run through the loop
- SET @Column_List = LEFT(@Column_List, LEN(@Column_List) - 1)
- SET @Actual_Values = LEFT(@Actual_Values, LEN(@Actual_Values) - 6)
- IF LTRIM(@Column_List) = ''
- BEGIN
- RAISERROR('No columns to select. There should at least be one column to generate the output',16,1)
- RETURN -1 --Failure. Reason: Looks like all the columns are ommitted using the @cols_to_exclude parameter
- END
- --Forming the final string that will be executed, to output the INSERT statements
- IF ( @include_column_list <> 0 )
- BEGIN
- SET @Actual_Values = 'SELECT ' + CASE WHEN @top IS NULL
- OR @top < 0 THEN ''
- ELSE ' TOP '
- + LTRIM(STR(@top))
- + ' '
- END + ''''
- + RTRIM(@Start_Insert) + ' ''+' + '''('
- + RTRIM(@Column_List) + '''+' + ''')'''
- + ' +''VALUES(''+ ' + @Actual_Values + '+'')''' + ' '
- + COALESCE(@from,
- ' FROM ' + CASE WHEN @owner IS NULL THEN ''
- ELSE '[' + LTRIM(RTRIM(@owner))
- + '].'
- END + '[' + RTRIM(@table_name) + ']'
- + '(NOLOCK)')
- END
- ELSE
- IF ( @include_column_list = 0 )
- BEGIN
- SET @Actual_Values = 'SELECT '
- + CASE WHEN @top IS NULL
- OR @top < 0 THEN ''
- ELSE ' TOP ' + LTRIM(STR(@top)) + ' '
- END + '''' + RTRIM(@Start_Insert)
- + ' '' +''VALUES(''+ ' + @Actual_Values + '+'')'''
- + ' ' + COALESCE(@from,
- ' FROM '
- + CASE WHEN @owner IS NULL THEN ''
- ELSE '[' + LTRIM(RTRIM(@owner))
- + '].'
- END + '[' + RTRIM(@table_name)
- + ']' + '(NOLOCK)')
- END
- --Determining whether to ouput any debug information
- IF @debug_mode = 1
- BEGIN
- PRINT '/*****START OF DEBUG INFORMATION*****'
- PRINT 'Beginning of the INSERT statement:'
- PRINT @Start_Insert
- PRINT ''
- PRINT 'The column list:'
- --PRINT @Column_List
- PRINT ''
- PRINT 'The SELECT statement executed to generate the INSERTs'
- PRINT @Actual_Values
- PRINT ''
- PRINT '*****END OF DEBUG INFORMATION*****/'
- PRINT ''
- END
- --PRINT '--INSERTs generated by ''sp_generate_inserts'' stored procedure written by Vyas'
- --PRINT '--Build number: 22'
- --PRINT '--Problems/Suggestions? Contact Vyas @ vyaskn@hotmail.com'
- --PRINT '--http://vyaskn.tripod.com'
- --PRINT ''
- --PRINT 'SET NOCOUNT ON'
- --PRINT ''
- --Determining whether to print IDENTITY_INSERT or not
- IF ( @IDN <> '' )
- BEGIN
- PRINT 'SET IDENTITY_INSERT ' + QUOTENAME(COALESCE(@owner,
- USER_NAME()))
- + '.' + QUOTENAME(@table_name) + ' ON'
- PRINT 'GO'
- PRINT ''
- END
- IF @disable_constraints = 1
- AND ( OBJECT_ID(QUOTENAME(COALESCE(@owner, USER_NAME())) + '.'
- + @table_name, 'U') IS NOT NULL )
- BEGIN
- IF @owner IS NULL
- BEGIN
- SELECT 'ALTER TABLE '
- + QUOTENAME(COALESCE(@target_table,
- @table_name))
- + ' NOCHECK CONSTRAINT ALL' AS '--Code to disable constraints temporarily'
- END
- ELSE
- BEGIN
- SELECT 'ALTER TABLE ' + QUOTENAME(@owner) + '.'
- + QUOTENAME(COALESCE(@target_table,
- @table_name))
- + ' NOCHECK CONSTRAINT ALL' AS '--Code to disable constraints temporarily'
- END
- PRINT 'GO'
- END
- PRINT ''
- PRINT 'PRINT ''Inserting values into ' + '['
- + RTRIM(COALESCE(@target_table, @table_name)) + ']' + ''''
- --All the hard work pays off here!!! You'll get your INSERT statements, when the next line executes!
- EXEC (@Actual_Values)
- PRINT 'PRINT ''Done'''
- PRINT ''
- IF @disable_constraints = 1
- AND ( OBJECT_ID(QUOTENAME(COALESCE(@owner, USER_NAME())) + '.'
- + @table_name, 'U') IS NOT NULL )
- BEGIN
- IF @owner IS NULL
- BEGIN
- SELECT 'ALTER TABLE '
- + QUOTENAME(COALESCE(@target_table,
- @table_name))
- + ' CHECK CONSTRAINT ALL' AS '--Code to enable the previously disabled constraints'
- END
- ELSE
- BEGIN
- SELECT 'ALTER TABLE ' + QUOTENAME(@owner) + '.'
- + QUOTENAME(COALESCE(@target_table,
- @table_name))
- + ' CHECK CONSTRAINT ALL' AS '--Code to enable the previously disabled constraints'
- END
- PRINT 'GO'
- END
- PRINT ''
- IF ( @IDN <> '' )
- BEGIN
- PRINT 'SET IDENTITY_INSERT ' + QUOTENAME(COALESCE(@owner,
- USER_NAME()))
- + '.' + QUOTENAME(@table_name) + ' OFF'
- PRINT 'GO'
- END
- --PRINT 'SET NOCOUNT OFF'
- SET NOCOUNT OFF
- RETURN 0 --Success. We are done!
- END
- GO
code-3:sp_generate_inserts腳本源代碼
在我的實(shí)際使用中,只有兩三個(gè)參數比較常用,分別是@table_name、@from和@owner,如果表的架構使用默認的dbo,則可以省略。以下是一個(gè)使用的例子:

figure-10:使用sp_generate_inserts的一個(gè)例子
其他參數的用法,這里就不一一解釋了。我經(jīng)常使用這個(gè)存儲過(guò)程做一些簡(jiǎn)單而少量(如數萬(wàn)行記錄以?xún)龋┑臄祿С鰧?,比前面介紹的方法方便快捷許多。但這個(gè)存儲過(guò)程支持處理一般常用的數據類(lèi)型,像XML這種類(lèi)型則不支持。還有,如果生成的數據太多太大,SSMS返回數據會(huì )很慢,甚至SSMS會(huì )掛了,這時(shí)還是使用SSMS自帶的導出腳本到文件穩妥些。如果使用生成的數據腳本文件很大,幾百MB甚至上GB,在導入時(shí),就不能直接使用SSMS直接打開(kāi)來(lái)執行了??梢允褂肧QLCMD實(shí)用工具來(lái)在執行腳本。如下面的一個(gè)例子,在D盤(pán)下有一個(gè)腳本1.sql,內容為:
- USE AdventureWorks2008R2
- GO
- SELECT * FROM Person.CountryRegion;
- GO
code-4:SQLMCD的測試腳本
在運行下輸入CMD,輸入:
sqlcmd -S localhost -d AdventureWorks2008R2 -i D:\1.sql
code-5:SQLMCD的命令
回車(chē)執行后如下圖,SQLCMD的詳細用法,請參考:https://msdn.microsoft.com/zh-cn/library/ms180944.aspx 和 https://msdn.microsoft.com/zh-cn/library/ms162773%28v=sql.105%29.aspx

figure-11:SQLCMD的測試例子
方法3:
使用BCP導出導入大容量數據??梢詤㈤單业牧硪黄┛汀?a target="_blank" >BCP導出導入大容量數據實(shí)踐》。
以上幾種方法是我在日常工作比較常使用的數據導出導入的工具,每一種方法都有各自的優(yōu)勢和不同的使用場(chǎng)景,使用不同的方法組合,可以節省不少時(shí)間,提高工作效率,希望對您的有所幫助。如果您有更好的建議或方法歡迎告訴我!
聯(lián)系客服