【问题标题】:SQL Server manage column descriptions by scriptSQL Server 通过脚本管理列描述
【发布时间】:2013-06-13 12:05:23
【问题描述】:

有没有办法通过脚本更改/更新和删除/删除列描述?

我使用sp_addextendedproperty 添加描述,但它不允许更新。当我尝试使用相同的 sp 来更新现有的描述值时,它会说“描述属性已经存在”

更改或删除/创建类似的解决方案对我来说都可以。

解决方案

在有用的答案和 cmets 之后,您可以在下面看到我的最终解决方案。可以帮助别人。

create procedure sp_set_column_description (
    @schema varchar(256),
    @table varchar(256),
    @column varchar(256),
    @description varchar(256))
    as
begin
    if exists (
        select p.* 
        from
            sys.extended_properties p, 
            sys.columns c, 
            sys.tables t, 
            sys.schemas s
        where
            t.schema_id = s.schema_id and
            c.object_id = t.object_id and
            p.major_id = t.object_id and
            p.minor_id = c.column_id and
            p.name = N'MS_Description' and 
            s.name = @schema and
            t.name = @table and
            c.name = @column
    )
        exec sys.sp_updateextendedproperty 
            @level0type=N'SCHEMA', @level0name=@schema,
            @level1type=N'TABLE', @level1name=@table,
            @level2type=N'COLUMN', @level2name=@column,
            @name=N'MS_Description', @value=@description
    else
        exec sys.sp_addextendedproperty 
            @level0type=N'SCHEMA', @level0name=@schema,
            @level1type=N'TABLE', @level1name=@table,
            @level2type=N'COLUMN', @level2name=@column,
            @name=N'MS_Description', @value=@description
end

go

create procedure sp_drop_column_description (
    @schema varchar(256),
    @table varchar(256),
    @column varchar(256))
    as
begin
    if exists (
        select p.* 
        from
            sys.extended_properties p, 
            sys.columns c, 
            sys.tables t, 
            sys.schemas s
        where
            t.schema_id = s.schema_id and
            c.object_id = t.object_id and
            p.major_id = t.object_id and
            p.minor_id = c.column_id and
            p.name = N'MS_Description' and 
            s.name = @schema and
            t.name = @table and
            c.name = @column
    )
        exec sys.sp_dropextendedproperty 
            @level0type=N'SCHEMA', @level0name=@schema,
            @level1type=N'TABLE', @level1name=@table,
            @level2type=N'COLUMN', @level2name=@column,
            @name=N'MS_Description'
end

【问题讨论】:

  • 我相信有相应的更新过程:sp_updateextendedproperty
  • 好像有sp_updateextendedpropertysp_dropextendedproperty。我会试试的。
  • 如果属性不存在,删除和更新过程会抛出异常,如果属性已经存在,则添加 sp 会抛出异常。我尝试了try add catch update 逻辑,但不知何故它会导致数据库锁定。执行“回滚”后,锁消失了,但是为这个简单的操作处理事务是不必要的复杂。我们最好检查扩展属性是否存在。
  • sys.fn_listextendedproperty 帮忙吗?

标签: sql sql-server


【解决方案1】:

结合 Steph Locke 的建议,您可以使用以下命令检查扩展 proc 是否存在:

if exists(
    SELECT  * 
    FROM    sys.extended_properties p
            join sys.columns c on p.major_id = c.object_id and p.minor_id = c.column_id 
    where   p.major_id = OBJECT_ID('yourtablename','table')
            and p.name = 'Description'  
)

【讨论】:

  • 为什么是SELECT top 1 1?看起来很恐怖,不比SELECT *
  • 习惯。我在使用“存在”创建半连接时这样做。我的印象是,在 那种 的情况下,它会产生性能差异。在上面的例子中,显然不是。
  • @Martin Smith 有趣的东西,谢谢。我尽量避免在我的 SQL 代码中出现不必要的绒毛,所以我会从头开始。编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多