DEFINITIONS

Definitions More Info.
Definition ID799
TitleSQL
CategoryNOTES
DefinitionPartition Ekleme-add YEAR bazinda
Definition Description-- 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
RecordBycunay
Record Date12-09-2017 17:35:35
Düzenle
Kopyala
Sil