1. 程式人生 > >SQL Server 動態生成分割槽指令碼

SQL Server 動態生成分割槽指令碼

--生成分割槽指令碼DECLARE @DataBaseName NVARCHAR(50)--資料庫名稱DECLARE @TableName NVARCHAR(50)--表名稱DECLARE @ColumnName NVARCHAR(50)--欄位名稱DECLARE @PartNumber INT--需要分多少個區DECLARE @Location NVARCHAR(50)--儲存分割槽檔案的路徑DECLARE @Size NVARCHAR(50)--分割槽初始化大小DECLARE @FileGrowth NVARCHAR(50)--分割槽檔案增量DECLARE @FunValue INT--分割槽分段值DECLARE
 @i INT
DECLARE @PartNumberStr NVARCHAR(50)
DECLARE @sql NVARCHAR(max)

--設定下面變數SET @DataBaseName = 'MyDataBase'
SET @TableName = 'User'
SET @ColumnName = 'Id'
SET @PartNumber = 4
SET @Location = 'E:\DataBase\'
SET @Size = '30MB'
SET @FileGrowth = '10%'
SET @FunValue = 10000000


--1.建立檔案組SET @i
 = 1
PRINT '--1.建立檔案組'
WHILE @i <= @PartNumber
BEGIN
    SET @PartNumberStr =  RIGHT('0' + CONVERT(NVARCHAR,@i),2)
    SET @sql = 'ALTER DATABASE ['+@DataBaseName +']
ADD FILEGROUP [FG_
'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+']'
    PRINT @sql + CHAR(13)
    SET @i=@i+1
END

--2.建立檔案
SET @i = 1
PRINT CHAR(13)+'--2.建立檔案'
WHILE @i <= @PartNumber
BEGIN
    SET @PartNumberStr =  RIGHT('0' + CONVERT(NVARCHAR,@i),2)
    SET @sql = 'ALTER DATABASE ['+@DataBaseName +']
ADD FILE
(NAME = N
''FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'_data'',FILENAME = N'''+@Location+'FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'_data.ndf'',SIZE = '+@Size+', FILEGROWTH = '+@FileGrowth+' )
TO FILEGROUP [FG_
'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'];'
    PRINT @sql + CHAR(13)
    SET @i=@i+1
END


--3.建立分割槽函式PRINT CHAR(13)+'--3.建立分割槽函式'
DECLARE @FunValueStr NVARCHAR(MAX
SET @i = 1
SET @FunValueStr = ''
WHILE @i < @PartNumber
BEGIN
    SET @FunValueStr = @FunValueStr + convert(NVARCHAR(50),(@i*@FunValue)) + ','
    SET @i=@i+1
END
SET @FunValueStr = substring(@FunValueStr,1,len(@FunValueStr)-1)
SET @sql = 'CREATE PARTITION FUNCTION
Fun_
'+@TableName+'_'+@ColumnName+'(INT) AS
RANGE RIGHT
FOR VALUES(
'+@FunValueStr+')'
PRINT @sql + CHAR(13)


--4.建立分割槽方案PRINT CHAR(13)+'--4.建立分割槽方案'
DECLARE @FileGroupStr NVARCHAR(MAX
SET @i = 1
SET @FileGroupStr = ''
WHILE @i <= @PartNumber
BEGIN
    SET @PartNumberStr =  RIGHT('0' + CONVERT(NVARCHAR,@i),2)
    SET @FileGroupStr = @FileGroupStr + '[FG_'+@TableName+'_'+@ColumnName+'_'+@PartNumberStr+'],'
    SET @i=@i+1
END
SET @FileGroupStr = substring(@FileGroupStr,1,len(@FileGroupStr)-1)
SET @sql = 'CREATE PARTITION SCHEME
Sch_
'+@TableName+'_'+@ColumnName+' AS
PARTITION Fun_
'+@TableName+'_'+@ColumnName+'
TO(
'+@FileGroupStr+')'
PRINT @sql + CHAR(13)


--5.分割槽函式的記錄數PRINT CHAR(13)+'--5.分割槽函式的記錄數'
SET @sql = 'SELECT $PARTITION.Fun_'+@TableName+'_'+@ColumnName+'('+@ColumnName+') AS Partition_num,
  MIN(
'+@ColumnName+') AS Min_value,MAX('+@ColumnName+') AS Max_value,COUNT(1) AS Record_num
FROM dbo.
'+@TableName+'
GROUP BY $PARTITION.Fun_
'+@TableName+'_'+@ColumnName+'('+@ColumnName+')
ORDER BY $PARTITION.Fun_
'+@TableName+'_'+@ColumnName+'('+@ColumnName+');'
PRINT @sql + CHAR(13)