qileilove

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

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

            一、 背景
            SQL Server,如果我們需要把數據庫A的所有表數據到數據庫B中,通常我們會怎么做呢?我會使用SSMS的導入導出功能,進行表數據的導入導出,無可厚非,這樣的導入非常簡單和方便;
            但是,當我們的表有上百個,而且有些表是有自增ID的,那么這個時候使用SSMS的話,你需要一個個手動設置(如圖1),你要知道,需要設置上百個的這些選項是件多么痛苦的事情,而且最后很可能會因為外鍵約束導致導入導出失敗。
            (圖1)
            雖然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)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 镇赉县| 临泉县| 三河市| 舞阳县| 泸水县| 孙吴县| 会同县| 晋城| 高安市| 礼泉县| 安达市| 邹城市| 岑巩县| 高邮市| 龙游县| 南汇区| 玉环县| 德化县| 淳安县| 扎鲁特旗| 勃利县| 山西省| 普洱| 六枝特区| 泽州县| 九寨沟县| 黔江区| 凉城县| 景宁| 大余县| 甘孜| 麻城市| 凯里市| 城步| 宣汉县| 天水市| 巴彦淖尔市| 鄯善县| 澜沧| 佛坪县| 克拉玛依市|