Mar*_*lli 6 database-design sql-server optimization partitioning sql-server-2014
我有一个脚本来生成创建表脚本。你可以在我对这个问题的回答中看到它。
关于这个问题here,看到答案有关于如何向表添加分区以及如何从表中删除分区的示例,我想看看任何阶段的脚本。
我找到了这个链接:如何找到应用于表的分区函数文本
如何生成用于创建分区函数和分区模式的脚本?
我正在编写一个脚本来生成create partition function
如下所示的 ,但它仅适用于我自己的PF_year分区函数,因为was很难克服sys.partition_range_values具有sql_variant数据类型作为值的事实。
当我使用案例时,出现以下错误:
消息 206,级别 16,状态 2,第 35 行
操作数类型冲突:int 与日期不兼容
然后在他的精彩回答Dan Guzman 中,向我们展示了SQL_VARIANT_PROPERTY一些我不知道的奇妙事物,现在我是一名新的 DBA 和新人。
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT
RADHE = 'CREATE PARTITION FUNCTION' + space(1) + quotename(spf.name) +
'(' +
COALESCE(baset.name,'data type not found') + ')' + CHAR(13) +
'AS RANGE ' + CASE WHEN CAST(spf.boundary_value_on_right AS int) = 1
THEN 'RIGHT ' ELSE 'LEFT ' END + CHAR(13) +
'FOR VALUES (' +
(SELECT STUFF(
(SELECT
[text()] = N',''' + CAST(
CASE st.system_type_id
WHEN 40 THEN CONVERT (date, sprv.value,126)
--WHEN 56 THEN CONVERT (int, sprv.value)
--ELSE CONVERT (int, sprv.value)
END
AS NVARCHAR) + ''''
FROM sys.partition_range_values sprv
WHERE sprv.function_id=spf.function_id
order by sprv.boundary_id
FOR XML PATH('') ), 1, 1,N'')+ N');')
,st.system_type_id
,spf.name AS [Name],
spf.function_id AS [ID],
CAST(spf.boundary_value_on_right AS int) AS [RangeType],
spf.create_date AS [CreateDate],
spf.fanout AS [NumberOfPartitions]
FROM
sys.partition_functions AS spf
INNER JOIN sys.partition_parameters AS spp
ON spp.function_id=spf.function_id
INNER JOIN sys.types AS st
ON st.system_type_id = st.user_type_id
and spp.system_type_id = st.system_type_id
LEFT OUTER JOIN sys.types AS baset
ON ( baset.user_type_id = spp.system_type_id
and baset.user_type_id = baset.system_type_id)
or ( (baset.system_type_id = spp.system_type_id)
and (baset.user_type_id = spp.user_type_id)
and (baset.is_user_defined = 0)
and (baset.is_assembly_type = 1))
WHERE spf.name = 'PF_YEAR';
Run Code Online (Sandbox Code Playgroud)
我从您对Terry C 的回答的评论中看到,您正在寻找一种 T-SQL 解决方案来编写分区函数和方案的脚本。虽然我认为 SMO 或 SSDT(通过 SSMS、Powershell、Visual Studio)是编写 DDL 脚本的正确工具,但它可以通过一些丑陋的 T-SQL 来完成。以下是此特定任务的示例脚本。
SELECT
N'CREATE PARTITION FUNCTION '
+ QUOTENAME(pf.name)
+ N'(' + t.name + N')'
+ N' AS RANGE '
+ CASE WHEN pf.boundary_value_on_right = 1 THEN N'RIGHT' ELSE N'LEFT' END
+ ' FOR VALUES('
+
(SELECT
STUFF((SELECT
N','
+ CASE
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN(N'char', N'varchar')
THEN QUOTENAME(CAST(r.value AS nvarchar(4000)), '''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN(N'nchar', N'nvarchar')
THEN N'N' + QUOTENAME(CAST(r.value AS nvarchar(4000)), '''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'date'
THEN QUOTENAME(FORMAT(CAST(r.value AS date), 'yyyy-MM-dd'),'''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'datetime'
THEN QUOTENAME(FORMAT(CAST(r.value AS datetime), 'yyyy-MM-ddTHH:mm:ss'),'''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN(N'datetime', N'smalldatetime')
THEN QUOTENAME(FORMAT(CAST(r.value AS datetime), 'yyyy-MM-ddTHH:mm:ss.fff'),'''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'datetime2'
THEN QUOTENAME(FORMAT(CAST(r.value AS datetime2), 'yyyy-MM-ddTHH:mm:ss.fffffff'),'''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'datetimeoffset'
THEN QUOTENAME(FORMAT(CAST(r.value AS datetimeoffset), 'yyyy-MM-dd HH:mm:ss.fffffff K'),'''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'time'
THEN QUOTENAME(FORMAT(CAST(r.value AS time), 'hh\:mm\:ss\.fffffff'),'''') --'HH\:mm\:ss\.fffffff'
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') = N'uniqueidentifier'
THEN QUOTENAME(CAST(r.value AS nvarchar(4000)), '''')
WHEN SQL_VARIANT_PROPERTY(r.value, 'BaseType') IN (N'binary', N'varbinary')
THEN CONVERT(nvarchar(4000), r.value, 1)
ELSE CAST(r.value AS nvarchar(4000))
END
FROM sys.partition_range_values AS r
WHERE pf.[function_id] = r.[function_id]
FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'),1,1,N'')
)
+ N');'
FROM sys.partition_functions pf
JOIN sys.partition_parameters AS pp ON
pp.function_id = pf.function_id
JOIN sys.types AS t ON
t.system_type_id = pp.system_type_id
AND t.user_type_id = pp.user_type_id
WHERE pf.name = N'PF_Year';
SELECT
N'CREATE PARTITION SCHEME ' + QUOTENAME(ps.name)
+ N' AS PARTTITION ' + QUOTENAME(pf.name)
+ N' TO ('
+
(SELECT
STUFF((SELECT
N',' + QUOTENAME(fg.name)
FROM sys.data_spaces ds
JOIN sys.destination_data_spaces AS dds ON dds.partition_scheme_id = ps.data_space_id
JOIN sys.filegroups AS fg ON fg.data_space_id = dds.data_space_id
WHERE ps.data_space_id = ds.data_space_id
ORDER BY dds.destination_id
FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)'),1,1,N'')
)
+ N');'
FROM sys.partition_schemes AS ps
JOIN sys.partition_functions AS pf ON pf.function_id = ps.function_id
WHERE ps.name = N'PSC_Year';
Run Code Online (Sandbox Code Playgroud)
小智 6
请尝试以下步骤:
使用 SSMS - 检查您的脚本选项。
转到工具/选项菜单。导航到“SQL Server 对象资源管理器”/“脚本”检查“脚本分区方案”是否设置为 True。(False 似乎是默认值)也值得检查“脚本文件组”的设置
在对象资源管理器中 - 右键单击您的数据库名称,然后为所有数据库对象选择任务/“生成脚本”。您应该在脚本文本的早期看到分区方案。
| 归档时间: |
|
| 查看次数: |
9949 次 |
| 最近记录: |