<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

    SQL Server 動(dòng)態(tài)生成數(shù)據(jù)庫所有表Insert語句

      一、 背景
      SQL Server,如果我們需要把數(shù)據(jù)庫A的所有表數(shù)據(jù)到數(shù)據(jù)庫B中,通常我們會怎么做呢?我會使用SSMS的導(dǎo)入導(dǎo)出功能,進(jìn)行表數(shù)據(jù)的導(dǎo)入導(dǎo)出,無可厚非,這樣的導(dǎo)入非常簡單和方便;
      但是,當(dāng)我們的表有上百個(gè),而且有些表是有自增ID的,那么這個(gè)時(shí)候使用SSMS的話,你需要一個(gè)個(gè)手動(dòng)設(shè)置(如圖1),你要知道,需要設(shè)置上百個(gè)的這些選項(xiàng)是件多么痛苦的事情,而且最后很可能會因?yàn)橥怄I約束導(dǎo)致導(dǎo)入導(dǎo)出失敗。
      (圖1)
      雖然SSMS在導(dǎo)入導(dǎo)出的最后一步提供了生成SSIS包的功能,但是對于轉(zhuǎn)移數(shù)據(jù)的需求來說,還是無法達(dá)到我想要的快速、方便。
      自然而然,我想到了INSERT INTO XX SELECT FROM XX WHERE這樣的方式(這種方式的好處就是可以對數(shù)據(jù)記錄、字段進(jìn)行控制),但是如何才能快速生成整個(gè)數(shù)據(jù)庫所有表的這些語句呢?
      假如你需要批量生成下面的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
      二、 腳本解釋
      (一) 我編寫了一個(gè)模板,這個(gè)模板你只需要設(shè)置@fromdb和@todb的名稱,這樣就會生成從@fromdb導(dǎo)出所有表插入到@todb中的SQL語句,需要注意的是:要選擇@fromdb對應(yīng)的數(shù)
    據(jù)庫執(zhí)行模板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'
    --游標(biāo)
    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
      (二) 下面就是返回的生成的部分腳本,模板會自動(dòng)判斷表是否存在自增字段,如果存在就會生成對應(yīng)的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 閱讀(416) 評論(0)  編輯  收藏 所屬分類: 測試學(xué)習(xí)專欄

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

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲午夜AV无码专区在线播放| 亚洲福利视频一区二区三区| 精品免费tv久久久久久久| 亚洲国产成人片在线观看 | 无码日韩精品一区二区免费| 亚洲国产欧洲综合997久久| 亚洲日韩在线中文字幕第一页 | 久久久久av无码免费网| 亚洲av永久无码精品秋霞电影秋 | 亚洲第一页综合图片自拍| 182tv免费视频在线观看| 亚洲一线产区二线产区精华| 免费人成视频x8x8入口| 99在线热视频只有精品免费| 亚洲精品无码不卡在线播放| 国产av天堂亚洲国产av天堂| 国产精品视频永久免费播放| 中文字幕免费人成乱码中国| 亚洲娇小性xxxx| 亚洲线精品一区二区三区 | 久久精品无码专区免费青青| 亚洲AV无码XXX麻豆艾秋| 亚洲午夜未满十八勿入| 免费a级毛片在线观看| 免费观看无遮挡www的视频| 一级毛片免费播放视频| 亚洲一区中文字幕| 亚洲bt加勒比一区二区| 国产中文字幕免费观看| 免费影院未满十八勿进网站| 三上悠亚电影全集免费| 久久精品国产亚洲AV天海翼| 亚洲成人黄色在线| 亚洲AV永久无码精品水牛影视 | 亚洲Av永久无码精品三区在线 | 一区二区三区免费在线视频 | 亚洲色中文字幕无码AV| 免费h黄肉动漫在线观看| 久久电影网午夜鲁丝片免费| 3344免费播放观看视频| 国产免费一区二区三区不卡|