日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SQLServer如何動態(tài)生成分區(qū)腳本

一、前言

吉縣網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

前段時間使用表分區(qū)比較多,雖然已經(jīng)寫了解惑:對SQL Server分區(qū)進(jìn)行合并(刪除)、SQL Server 2005 分區(qū)模板與實(shí)例,但是在實(shí)踐中一直感覺修改SQL腳本的時間比較多,一直想抽個時間來把分區(qū)腳本進(jìn)行動態(tài)化,今天終于付之于行動了。需要說明的一點(diǎn),下面的腳本并不能滿足所有情況,用戶可以根據(jù)自己的需要進(jìn)行相應(yīng)的調(diào)整,應(yīng)該可以滿足你的需求的。

在SQL Server 2005中只能通過SQL腳本來創(chuàng)建表分區(qū),而在SQL Server 2008的SSMS中已經(jīng)提供了操作界面進(jìn)行表分區(qū),但是也不能把操作生成SQL腳本,所以,下面的SQL的應(yīng)用場景包括SQL Server 2005、SQL Server 2008。

二、分解

下面就是生成分區(qū)的腳本了,在執(zhí)行之前,你需要填寫數(shù)據(jù)庫名稱、表名、分區(qū)表字段、需要的分區(qū)數(shù)、保存分區(qū)文件的路徑、分區(qū)初始化大小、分區(qū)文件的增量、分區(qū)邊界值;

這 里的分區(qū)邊界值是按照int類型進(jìn)行增量計算的,比如你想以每100W進(jìn)行范圍分區(qū)的話,那你只要設(shè)置@FunValue為100W;如果你的分區(qū)邊界值 是其它類型值或者是不等范圍的分區(qū),那么你只要修改這個變量為字符串,并對分區(qū)函數(shù)的生成代碼進(jìn)行相應(yīng)修改就可以滿足你的需求了。

通常情況下,我們會以一個表Id(int),并且是自增作為分區(qū)字段,這樣就很容易區(qū)分歷史數(shù)據(jù)了,而且對分區(qū)的操作隔離也是最明顯的。

 
 
 
  1. --生成分區(qū)腳本
  2. DECLARE @DataBaseName NVARCHAR(50)--數(shù)據(jù)庫名稱
  3. DECLARE @TableName NVARCHAR(50)--表名稱
  4. DECLARE @ColumnName NVARCHAR(50)--字段名稱
  5. DECLARE @PartNumber INT--需要分多少個區(qū)
  6. DECLARE @Location NVARCHAR(50)--保存分區(qū)文件的路徑
  7. DECLARE @Size NVARCHAR(50)--分區(qū)初始化大小
  8. DECLARE @FileGrowth NVARCHAR(50)--分區(qū)文件增量
  9. DECLARE @FunValue INT--分區(qū)分段值
  10. DECLARE @i INT
  11. DECLARE @PartNumberStr NVARCHAR(50)
  12. DECLARE @sql NVARCHAR(max)
  13. --設(shè)置下面變量
  14. SET @DataBaseName = 'MyDataBase'
  15. SET @TableName = 'User'
  16. SET @ColumnName = 'Id'
  17. SET @PartNumber = 4
  18. SET @Location = 'E:\DataBase\'
  19. SET @Size = '30MB'
  20. SET @FileGrowth = '10%'
  21. SET @FunValue = 10000000
 
 
 
  1. --1.創(chuàng)建文件組
  2. SET @i = 1
  3. PRINT '--1.創(chuàng)建文件組'
  4. WHILE @i <= @PartNumber
  5. BEGIN
  6.     SET @PartNumberStr = RIGHT('0' + CONVERT(NVARCHAR,@i),2)
  7.     SET @sql = 'ALTER DATABASE ['+@DataBaseName +']
  8. ADD FILEGROUP [FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+']'
  9.     PRINT @sql + CHAR(13)
  10.     SET @i=@i+1
  11. END
  12. --2.創(chuàng)建文件
  13. SET @i = 1
  14. PRINT CHAR(13)+'--2.創(chuàng)建文件'
  15. WHILE @i <= @PartNumber
  16. BEGIN
  17.     SET @PartNumberStr = RIGHT('0' + CONVERT(NVARCHAR,@i),2)
  18.     SET @sql = 'ALTER DATABASE ['+@DataBaseName +']
  19. ADD FILE
  20. (NAME = N''FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'_data'',FILENAME = N'''+@Location+'FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'_data.ndf'',SIZE = '+@Size+', FILEGROWTH = '+@FileGrowth+' )
  21. TO FILEGROUP [FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'];'
  22.     PRINT @sql + CHAR(13)
  23.     SET @i=@i+1
  24. END
  25. --3.創(chuàng)建分區(qū)函數(shù)
  26. PRINT CHAR(13)+'--3.創(chuàng)建分區(qū)函數(shù)'
  27. DECLARE @FunValueStr NVARCHAR(MAX)
  28. SET @i = 1
  29. SET @FunValueStr = ''
  30. WHILE @i < @PartNumber
  31. BEGIN
  32.     SET @FunValueStr = @FunValueStr + convert(NVARCHAR(50),(@i*@FunValue)) + ','
  33.     SET @i=@i+1
  34. END
  35. SET @FunValueStr = substring(@FunValueStr,1,len(@FunValueStr)-1)
  36. SET @sql = 'CREATE PARTITION FUNCTION
  37. Fun_'+@TableName+'_'+@ColumnName+'(INT) AS
  38. RANGE RIGHT
  39. FOR VALUES('+@FunValueStr+')'
  40. PRINT @sql + CHAR(13) 
  41. --4.創(chuàng)建分區(qū)方案
  42. PRINT CHAR(13)+'--4.創(chuàng)建分區(qū)方案'
  43. DECLARE @FileGroupStr NVARCHAR(MAX)
  44. SET @i = 1
  45. SET @FileGroupStr = ''
  46. WHILE @i <= @PartNumber
  47. BEGIN
  48.     SET @PartNumberStr = RIGHT('0' + CONVERT(NVARCHAR,@i),2)
  49.     SET @FileGroupStr = @FileGroupStr + '[FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'],'
  50.     SET @i=@i+1
  51. END
  52. SET @FileGroupStr = substring(@FileGroupStr,1,len(@FileGroupStr)-1)
  53. SET @sql = 'CREATE PARTITION SCHEME
  54. Sch_'+@TableName+'_'+@ColumnName+' AS
  55. PARTITION Fun_'+@TableName+'_'+@ColumnName+'
  56. TO('+@FileGroupStr+')'
  57. PRINT @sql + CHAR(13)
  58. --5.分區(qū)函數(shù)的記錄數(shù)
  59. PRINT CHAR(13)+'--5.分區(qū)函數(shù)的記錄數(shù)'
  60. SET @sql = 'SELECT $PARTITION.Fun_'+@TableName+'_'+@ColumnName+'('+@ColumnName+') AS Partition_num,
  61.  MIN('+@ColumnName+') AS Min_value,MAX('+@ColumnName+') AS Max_value,COUNT(1) AS Record_num
  62. FROM dbo.'+@TableName+'
  63. GROUP BY $PARTITION.Fun_'+@TableName+'_'+@ColumnName+'('+@ColumnName+')
  64. ORDER BY $PARTITION.Fun_'+@TableName+'_'+@ColumnName+'('+@ColumnName+');'
  65. PRINT @sql + CHAR(13)

生成的腳本如下:

 
 
 
  1. --1.創(chuàng)建文件組
  2. ALTER DATABASE [MyDataBase]
  3. ADD FILEGROUP [FG_User_Id_01]
  4. ALTER DATABASE [MyDataBase]
  5. ADD FILEGROUP [FG_User_Id_02]
  6. ALTER DATABASE [MyDataBase]
  7. ADD FILEGROUP [FG_User_Id_03]
  8. ALTER DATABASE [MyDataBase]
  9. ADD FILEGROUP [FG_User_Id_04]
  10. --2.創(chuàng)建文件
  11. ALTER DATABASE [MyDataBase]
  12. ADD FILE
  13. (NAME = N'FG_User_Id_01_data',FILENAME = N'E:\DataBase\FG_User_Id_01_data.ndf',SIZE = 30MB, FILEGROWTH = 10% )
  14. TO FILEGROUP [FG_User_Id_01];
  15. ALTER DATABASE [MyDataBase]
  16. ADD FILE
  17. (NAME = N'FG_User_Id_02_data',FILENAME = N'E:\DataBase\FG_User_Id_02_data.ndf',SIZE = 30MB, FILEGROWTH = 10% )
  18. TO FILEGROUP [FG_User_Id_02];
  19. ALTER DATABASE [MyDataBase]
  20. ADD FILE
  21. (NAME = N'FG_User_Id_03_data',FILENAME = N'E:\DataBase\FG_User_Id_03_data.ndf',SIZE = 30MB, FILEGROWTH = 10% )
  22. TO FILEGROUP [FG_User_Id_03];
  23. ALTER DATABASE [MyDataBase]
  24. ADD FILE
  25. (NAME = N'FG_User_Id_04_data',FILENAME = N'E:\DataBase\FG_User_Id_04_data.ndf',SIZE = 30MB, FILEGROWTH = 10% )
  26. TO FILEGROUP [FG_User_Id_04];
  27. --3.創(chuàng)建分區(qū)函數(shù)
  28. CREATE PARTITION FUNCTION
  29. Fun_User_Id(INT) AS
  30. RANGE RIGHT
  31. FOR VALUES(10000000,20000000,30000000)
  32. --4.創(chuàng)建分區(qū)方案
  33. CREATE PARTITION SCHEME
  34. Sch_User_Id AS
  35. PARTITION Fun_User_Id
  36. TO([FG_User_Id_01],[FG_User_Id_02],[FG_User_Id_03],[FG_User_Id_04])
  37. --5.分區(qū)函數(shù)的記錄數(shù)
  38. SELECT $PARTITION.Fun_User_Id(Id) AS Partition_num,
  39.  MIN(Id) AS Min_value,MAX(Id) AS Max_value,COUNT(1) AS Record_num
  40. FROM dbo.User
  41. GROUP BY $PARTITION.Fun_User_Id(Id)
  42. ORDER BY $PARTITION.Fun_User_Id(Id);

三、后記

在MSND的SQL Server 2005中的分區(qū)表和索引中同樣提供了一個腳本用于生成表分區(qū),和他不同的是:他采用了表來保存文件路徑,再使用游標(biāo)來創(chuàng)建文件而已,其實(shí)這只能生成一部分代碼,而我的腳本不同之處就是能***限度的生成常規(guī)表分區(qū)的常用代碼,方便快捷很多。有興趣的童鞋可以去下載。

上面使用表保存信息的這種想法在后期的數(shù)據(jù)搬遷(比如需要對一個現(xiàn)有的表進(jìn)行表分區(qū),這種情況下通常會先建一個分區(qū)表,再進(jìn)行導(dǎo)入現(xiàn)有表的數(shù)據(jù))中是有很大的用處的,后面的文章中會講講如何進(jìn)行自動化的數(shù)據(jù)搬遷,敬請留意。


當(dāng)前標(biāo)題:SQLServer如何動態(tài)生成分區(qū)腳本
標(biāo)題網(wǎng)址:http://www.dlmjj.cn/article/cdghgig.html