-- Partition dynamic sql içeren sorgu komutu SET NOCOUNT ON --Aşağıdaki script yıllık partitiona göre yazılmıştır DECLARE @dbname NVARCHAR(100), --database adı @tableName NVARCHAR(100), -- partition yapılacak tablo adı @pstartYear int, -- Partition başlangıç yılı @pendYear int, -- Partition bitiş yılı @filename NVARCHAR(500), -- Partition dosyalarının ekleneceği dosya dizini (path) @initialsize int, -- Dosyanın başlangıç boyutu @filegrowth int, -- Dosyanın otomatik büyüme boyutu. Patition yapılan dosyanın kaç MB kaç MB büyümesini istersin? @sql NVARCHAR(MAX), -- FILE GROUP ve FILE EKLEMEK için sql komut statırı @sqlEkgroup NVARCHAR(MAX), @sql1 NVARCHAR(MAX), -- Partition FUNCTION oluşturulurken kullanılan komut satırı @dateForFunc NVARCHAR(MAX), -- Partition ##dateTmpForpFnc tablosundaki kayıtları yan yana yazdırmak için atanan parametre @boundarySide NVARCHAR(10), -- Partition BOUNDARY direction.(LEFT or RIGHT) @dataType NVARCHAR(20), -- Partition Function KEY FIELD data tipi. Hem fonksiyon oluştururken hem de tablo oluştururken bu field gerekmektedir. @sql2 NVARCHAR(MAX), -- Partition SCHEMA oluşturulurken kullanılan sql komut satırı @groupValue NVARCHAR(MAX), -- Partition ##groupForpScheme tablosundaki kayıtları yanyana yazdırmak için atanan değer @clusteredIndexColumnName NVARCHAR(100), @sqlIndex NVARCHAR(MAX), @sqlDropSchemeFnc nvarchar(2000) -- Partition Scheme ve Partition Function drop eden sql komutu SET @dbname = 'TEST' SET @tableName = 'prItemBarcode' SET @filename = 'D:\MSSQLSERVER\USERDATA\PARTITIONED\' SET @initialsize = 20 SET @filegrowth = 10 SET @boundarySide = 'RIGHT' SET @dataType = 'datetime' SET @clusteredIndexColumnName = 'CreatedDate' SET @pstartYear = 2016 SET @pendYear = 2017 -- Mesela sadece 2 yıl için partition yapmak istiyoruz, 2016-01-01 den 2017-01-01 tam bir yıldır. -- (2016-01-01) - (2017-01-01) - (2018-01-01) tam iki yıldır. --2018-01-01 dan sonraki datalar PRIMARY fileGROUP eklenir. --Partitionun 2017 yılının sonuna kadar kapsamasını istiyorsak @endyear 2018 yılana KADAR SET etmemiz gerekmektedir. --The total number of partitions is always the total number of boundary values + 1. -- Eğer Partition Scheme ve function varsa drop eder. Bu objeler drop olmadan partition dosyalarını drop edemezsiniz. SET @sqlDropSchemeFnc = +'USE '+@dbname +char(13)+char(10) +'GO'+char(13)+char(10) +'IF EXISTS(SELECT [name] FROM '+@dbname+'.sys.partition_functions)' +char(13)+char(10) +'DROP PARTITION FUNCTION pfnc_'+@tablename +char(13)+char(10) +'GO'+char(13)+char(10) +'IF EXISTS(SELECT [name] FROM '+@dbname+'.sys.partition_schemes)' +char(13)+char(10) +'DROP PARTITION SCHEME pscheme_'+@tableName PRINT(@sqlDropSchemeFnc) IF EXISTS (SELECT TABLE_NAME FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '##dateTmpForpFnc') DROP TABLE ##dateTmpForpFnc CREATE TABLE ##dateTmpForpFnc (datevalue varchar(19)) IF EXISTS (SELECT TABLE_NAME FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '##groupForpScheme') DROP TABLE ##groupForpScheme CREATE TABLE ##groupForpScheme (groupValue VARCHAR(100)) WHILE (@pstartYear<=@pendYear) BEGIN SET @sql='USE '+@dbname +char(13)+char(10) +'GO'+char(13)+char(10) +'ALTER DATABASE '+@dbname+' ADD FILEGROUP ['+@tableName+'G'+'_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4))+']' +char(13)+char(10) +'GO'+char(13)+char(10) +'ALTER DATABASE '+@dbname+' ADD FILE (name = '+@tableName+'F_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4))+',FILENAME = '+''''+@filename+@tableName+'F_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4))+'.ndf'''+',' +' size = '+ CAST(@initialsize AS NVARCHAR(5))+' MB, '+'filegrowth = '+CAST(@filegrowth AS NVARCHAR(5))+' MB) TO FILEGROUP ['+@tableName+'G'+'_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4))+']' +char(13)+char(10) +'GO' +char(13)+char(10) INSERT INTO ##dateTmpForpFnc SELECT CAST(@pstartYear+1 AS NVARCHAR(4))+'-01-01T00:00:00' INSERT INTO ##groupForpScheme SELECT @tableName+'G'+'_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4)) PRINT(@sql) SET @pstartYear = @pstartYear+1 END INSERT INTO ##groupForpScheme SELECT @tableName+'G'+'_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4)) SET @sqlEkgroup='USE '+@dbname +char(13)+char(10) +'GO' +char(13)+char(10) +'ALTER DATABASE '+@dbname+' ADD FILEGROUP ['+@tableName+'G'+'_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4))+']' +char(13)+char(10) +'GO' +char(13)+char(10) PRINT(@sqlEkgroup) SELECT @tableName+'G'+'_PARTITIONYEAR'+CAST(@pstartYear AS NVARCHAR(4)) SELECT @dateForFunc = COALESCE(@dateForFunc +''', ','') +'N'''+CAST((LTRIM(RTRIM(datevalue))) AS NVARCHAR(19)) FROM ##dateTmpForpFnc T SET @sql1 = 'BEGIN TRANSACTION ' +char(13)+char(10) +'CREATE PARTITION FUNCTION [pfnc_'+@tableName+']('+@dataType+') AS RANGE '+@boundarySide+' FOR VALUES ('+@dateForFunc+''')' +char(13)+char(10) +char(13)+char(10) PRINT(@sql1) SELECT @groupValue = COALESCE(@groupValue +', ','') +'['+CAST((LTRIM(RTRIM(groupValue))) AS NVARCHAR(100))+']' FROM ##groupForpScheme T SET @sql2 = 'CREATE PARTITION SCHEME [pscheme_'+@tableName+'] AS PARTITION [pfnc_'+@tableName+'] TO ('+@groupValue+')' +char(13)+char(10) +'COMMIT TRANSACTION' +char(13)+char(10) +char(13)+char(10) +'--Bu bölümde tabloyu oluştur. Aşağıdaki tablo örnek tablodur.' +char(13)+char(10) +'CREATE TABLE TABLOADI (ID INT,Name varchar(30)....) ON [pscheme_'+@tableName+'] ('+@clusteredIndexColumnName+')' +char(13)+char(10) +char(13)+char(10) +'CREATE CLUSTERED INDEX [ClusteredIndex_on_'+@tableName+'_'+LEFT(REPLACE(REPLACE(CONVERT(VARCHAR(20), GETDATE(), 126),'-',''),':',''),15)+'] ON [dbo].['+@tableName+']' +char(13)+char(10) +'(['+@clusteredIndexColumnName+'] ASC )WITH(SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [pscheme_'+@tableName+'] ('+@clusteredIndexColumnName+')' PRINT (@sql2) SELECT * FROM ##dateTmpForpFnc SELECT * FROM ##groupForpScheme