所以,我有一个添加扩展属性的脚本,一些描述一个表,一些描述一个列。如何在添加扩展属性之前检查它是否存在,以便脚本不会引发错误?
原文由 ScubaSteve 发布,翻译遵循 CC BY-SA 4.0 许可协议
所以,我有一个添加扩展属性的脚本,一些描述一个表,一些描述一个列。如何在添加扩展属性之前检查它是否存在,以便脚本不会引发错误?
原文由 ScubaSteve 发布,翻译遵循 CC BY-SA 4.0 许可协议
喜欢 Brian Westrich 和 corky_bantam 的答案
以下是我试图实现的两者的组合。不确定是否有人会感兴趣,但我认为我分享一下以防万一。
我希望能够为描述、源字段、源系统等设置多个不同的扩展属性。实际上,我在顶部放置了另一个存储过程,然后我可以将标准值提供给它。
我确实喜欢 corky_bantam 所做的跨数据库运行的选项,但我决定在这个版本中保持简单。也许将来我会发现需要跨数据库运行它,我会偷那个版本:)
我试图简化 if not exist 部分——如果它真的更好的话还有待商榷,但我发现它更容易理解。
我制作了大多数值变量(我的高中 IT 老师会很自豪),所以我可以运行它以获得视图等。
还要注意 @column_name VARCHAR(500) = NULL
我这样做了,所以我在运行时根本不需要提供变量。在对象级别设置值时,我懒得一直放@column_name = NULL
CREATE OR ALTER PROCEDURE [tools].[sp_set_extended_properties]
@extended_property_name VARCHAR(500), --the extended property to set/update
@schema_name VARCHAR(500), --schema name
@object_name VARCHAR(500), --object name
@column_name VARCHAR(500) = NULL, -- column name, NULL if description for object
@value sql_variant --the value to assign
AS
BEGIN
SET NOCOUNT ON;
DECLARE @object_id INT
DECLARE @object_type VARCHAR(50)
DECLARE @column_id INT
SELECT
@object_id = o.object_id
,@object_type = CASE o.type
WHEN 'U' THEN 'TABLE'
ELSE o.type_desc END
,@column_id = c.column_id
FROM sys.objects o
INNER JOIN sys.schemas s on o.schema_id = s.schema_id
INNER JOIN sys.columns c on o.object_id = c.object_id
WHERE o.name = @object_name
AND s.name = @schema_name
AND c.name = ISNULL(@column_name, c.name)
--SELECT @object_id, @object_type, @column_id
IF @column_name IS NOT NULL
IF NOT EXISTS (SELECT NULL
FROM SYS.EXTENDED_PROPERTIES
WHERE [major_id] = @object_id
AND [name] = @extended_property_name
AND [minor_id] = @column_id)
EXECUTE sp_addextendedproperty @name = @extended_property_name, @value = @value,
@level0type = N'SCHEMA', @level0name = @schema_name, @level1type = @object_type,
@level1name = @object_name, @level2type = N'COLUMN', @level2name = @column_name;
ELSE
EXECUTE sp_updateextendedproperty @name = @extended_property_name,
@value = @value, @level0type = N'SCHEMA', @level0name = @schema_name,
@level1type = @object_type, @level1name = @object_name,
@level2type = N'COLUMN', @level2name = @column_name;
ELSE
IF NOT EXISTS (SELECT NULL
FROM SYS.EXTENDED_PROPERTIES
WHERE [major_id] = @object_id
AND [name] = @extended_property_name
AND [minor_id] = 0)
EXECUTE sp_addextendedproperty @name = @extended_property_name, @value = @value,
@level0type = N'SCHEMA', @level0name = @schema_name,
@level1type = @object_type, @level1name = @object_name;
ELSE
EXECUTE sp_updateextendedproperty @name = @extended_property_name, @value = @value,
@level0type = N'SCHEMA', @level0name = @schema_name,
@level1type = @object_type, @level1name = @object_name;
END
GO
原文由 Ashley McLellan 发布,翻译遵循 CC BY-SA 4.0 许可协议
第一个脚本检查描述表的扩展属性是否存在:
第二个脚本检查描述列的扩展属性是否存在: