qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          SQL Server 動態生成數據庫所有表Insert語句

            一、 背景
            SQL Server,如果我們需要把數據庫A的所有表數據到數據庫B中,通常我們會怎么做呢?我會使用SSMS的導入導出功能,進行表數據的導入導出,無可厚非,這樣的導入非常簡單和方便;
            但是,當我們的表有上百個,而且有些表是有自增ID的,那么這個時候使用SSMS的話,你需要一個個手動設置(如圖1),你要知道,需要設置上百個的這些選項是件多么痛苦的事情,而且最后很可能會因為外鍵約束導致導入導出失敗。
           ?。▓D1)
            雖然SSMS在導入導出的最后一步提供了生成SSIS包的功能,但是對于轉移數據的需求來說,還是無法達到我想要的快速、方便。
            自然而然,我想到了INSERT INTO XX SELECT FROM XX WHERE這樣的方式(這種方式的好處就是可以對數據記錄、字段進行控制),但是如何才能快速生成整個數據庫所有表的這些語句呢?
            假如你需要批量生成下面的SQL,我想這篇文章就可以幫到你了:
            --[OpinionList]
            SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] ON
            INSERT INTO [master_new].[dbo].[OpinionList](Id,Batch,LinkId,DB_Names,CreateTime)
            SELECT * FROM [DBA_DB].[dbo].[OpinionList]
            SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] OFF
            GO
            二、 腳本解釋
            (一) 我編寫了一個模板,這個模板你只需要設置@fromdb和@todb的名稱,這樣就會生成從@fromdb導出所有表插入到@todb中的SQL語句,需要注意的是:要選擇@fromdb對應的數
          據庫執行模板SQL,不然無法生成需要的表和字段。
          DECLARE @fromdb VARCHAR(100)
          DECLARE @todb VARCHAR(100)
          DECLARE @tablename VARCHAR(100)
          DECLARE @columnnames NVARCHAR(300)
          DECLARE @isidentity NVARCHAR(30)
          DECLARE @temsql NVARCHAR(max)
          DECLARE @sql NVARCHAR(max)
          SET @fromdb = 'master'
          SET @todb = 'master_new'
          --游標
          DECLARE @itemCur CURSOR
          SET @itemCur = CURSOR FOR
          SELECT '['+[name]+']' from sys.tables WHERE type='U' order by name
          OPEN @itemCur
          FETCH NEXT FROM @itemCur INTO @tablename
          WHILE @@FETCH_STATUS=0
          BEGIN
          SET @sql = ''
          --獲取表字段
          SET @temsql = N'
          BEGIN
          SET @columnnamesOUT =''''
          SELECT @columnnamesOUT = @columnnamesOUT + '','' + name
          From sys.columns where object_id=OBJECT_ID(''['+@fromdb+'].dbo.'+@tablename+''')
          order by column_id
          SELECT @columnnamesOUT=substring(@columnnamesOUT,2,len(@columnnamesOUT))
          END
          '
          EXEC sp_executesql @temsql,N'@columnnamesOUT NVARCHAR(300) OUTPUT',@columnnamesOUT=@columnnames OUTPUT
          PRINT ('--'+@tablename)
          --判斷是否有自增字段
          SET @temsql = N'
          BEGIN
          SET @isidentityOUT =''''
          SELECT @isidentityOUT = name
          From sys.columns where object_id=OBJECT_ID(''['+@fromdb+'].dbo.'+@tablename+''')
          and is_identity = 1
          END
          '
          EXEC sp_executesql @temsql,N'@isidentityOUT NVARCHAR(30) OUTPUT',@isidentityOUT=@isidentity OUTPUT
          --IDENTITY_INSERT ON
          IF @isidentity != ''
          BEGIN
          SET @sql = 'SET IDENTITY_INSERT ['+@todb+'].[dbo].['+@tablename+'] ON
          '
          END
          --INSERT
          SET @sql = @sql+'INSERT INTO ['+@todb+'].[dbo].['+@tablename+']('+@columnnames+')
          SELECT * FROM ['+@fromdb+'].[dbo].['+@tablename+']'
          --IDENTITY_INSERT OFF
          IF @isidentity != ''
          BEGIN
          SET @sql = @sql+'
          SET IDENTITY_INSERT ['+@todb+'].[dbo].['+@tablename+'] OFF'
          END
          --返回SQL
          PRINT(@sql)PRINT('GO')+CHAR(13)
          FETCH NEXT FROM @itemCur INTO @tablename
          END
          CLOSE @itemCur
          DEALLOCATE @itemCur
            (二) 下面就是返回的生成的部分腳本,模板會自動判斷表是否存在自增字段,如果存在就會生成對應的IDENTITY_INSERT語句。
          --spt_values
          INSERT INTO [master_new].[dbo].[spt_values](name,number,type,low,high,status)
          SELECT * FROM [master].[dbo].[spt_values]
          GO
          --[OpinionList]
          SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] ON
          INSERT INTO [master_new].[dbo].[OpinionList](Id,Batch,LinkId,DB_Names,CreateTime)
          SELECT * FROM [DBA_DB].[dbo].[OpinionList]
          SET IDENTITY_INSERT [master_new].[dbo].[OpinionList] OFF
          GO

          posted on 2014-11-06 10:40 順其自然EVO 閱讀(418) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鄂托克旗| 什邡市| 仪陇县| 海丰县| 盈江县| 大足县| 鸡泽县| 清镇市| 梨树县| 海丰县| 都江堰市| 平塘县| 石嘴山市| 东乌珠穆沁旗| 察哈| 离岛区| 定西市| 临西县| 皋兰县| 湟中县| 绥阳县| 宿松县| 衡阳市| 武宁县| 任丘市| 潼关县| 原阳县| 兴和县| 阆中市| 龙江县| 拉萨市| 绍兴县| 红河县| 建瓯市| 营山县| 嘉峪关市| 南安市| 江永县| 延川县| 甘肃省| 清水河县|