-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathCreatePartitionFunctionFromMetadata.sql
More file actions
127 lines (101 loc) · 2.8 KB
/
Copy pathCreatePartitionFunctionFromMetadata.sql
File metadata and controls
127 lines (101 loc) · 2.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
Purpose:
- Build a partition function dynamically from metadata stored in helper tables.
Customization:
- Review PartitionManagement and placeholder names before execution.
*/
BEGIN TRY
DECLARE
@PartitionManagementID INT,
@TableName NVARCHAR(50),
@SQLPartitionText NVARCHAR(MAX),
@UpdateDate DATETIME;
-- Fetch partition information from PartitionManagement
SELECT
TOP 1 @PartitionManagementID = PartitionManagementID,
@TableName = TableName,
@SQLPartitionText = SQLPartitionText,
@UpdateDate = UpdateDate
FROM
PartitionManagement;
-- Choose the latest record based on UpdateDate
DECLARE @PartitionValues NVARCHAR(MAX);
-- Execute the SQLPartitionText to get partition values and their types
SET
@PartitionValues = '';
SET
@SQLPartitionText = 'SELECT * FROM (' + @SQLPartitionText + ') SubQuery';
CREATE TABLE #TempPartitionValues (
PartitionColumns NVARCHAR(MAX),
ColumnsTypes NVARCHAR(MAX)
);
INSERT INTO
#TempPartitionValues (PartitionColumns, ColumnsTypes) EXEC(@SQLPartitionText);
DECLARE @PartitionFunctionParams NVARCHAR(MAX);
SELECT
@PartitionValues = STRING_AGG(PartitionColumns, ', ')
FROM
(
SELECT
STRING_AGG(CONVERT(NVARCHAR(MAX), ColumnValue), ', ') AS PartitionColumns
FROM
(
SELECT
value AS ColumnValue
FROM
#TempPartitionValues CROSS APPLY STRING_SPLIT(PartitionColumns, ',')
) AS SubResult
GROUP BY
SubResult.ColumnValue
) AS FinalResult;
SET
@PartitionFunctionParams = (
SELECT
TOP 1 ColumnsTypes
FROM
#TempPartitionValues
);
DECLARE @SQLPartitionFunction NVARCHAR(MAX);
SET
@SQLPartitionFunction = N'CREATE PARTITION FUNCTION PartitionFunctionName (' + @PartitionFunctionParams + ') AS RANGE RIGHT FOR VALUES (' + @PartitionValues + ');';
EXEC (@SQLPartitionFunction);
-- Insert partition function elements into PartitionManagementDetail
INSERT INTO
PartitionManagementDetail (PartitionManagementID, Line, Text)
SELECT
@PartitionManagementID,
ROW_NUMBER() OVER(
ORDER BY
(
SELECT
NULL
)
) AS Line,
ColumnValue
FROM
(
SELECT
value AS ColumnValue
FROM
#TempPartitionValues CROSS APPLY STRING_SPLIT(PartitionColumns, ',')
) AS SubResult
GROUP BY
ColumnValue;
-- Display the generated SQL for Partition Function creation
PRINT 'Generated SQL for Partition Function:';
PRINT @SQLPartitionFunction;
-- Display the inserted partition function elements
PRINT 'Partition Function Elements:';
SELECT
*
FROM
PartitionManagementDetail
WHERE
PartitionManagementID = @PartitionManagementID;
DROP TABLE #TempPartitionValues;
END TRY
BEGIN CATCH
PRINT 'An error occurred: ' + ERROR_MESSAGE();
-- Drop temporary table if an error occurs
IF OBJECT_ID('tempdb..#TempPartitionValues') IS NOT NULL DROP TABLE #TempPartitionValues;
END CATCH