Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server通过脚本管理列描述_Sql_Sql Server - Fatal编程技术网

SQL Server通过脚本管理列描述

SQL Server通过脚本管理列描述,sql,sql-server,Sql,Sql Server,有没有办法通过脚本更改/更新和删除/删除列描述 我使用sp_addextendedproperty添加描述,但它不允许更新。当我尝试使用同一sp更新现有描述值时,它会显示类似“描述属性已存在”的内容 alter或drop/create like解决方案都适合我 解决方案 在得到有用的答案和评论后,您可以在下面看到我的最终解决方案。可能会帮助某人 create procedure sp_set_column_description ( @schema varchar(256), @

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

我使用
sp_addextendedproperty
添加描述,但它不允许更新。当我尝试使用同一sp更新现有描述值时,它会显示类似“描述属性已存在”的内容

alter或drop/create like解决方案都适合我

解决方案 在得到有用的答案和评论后,您可以在下面看到我的最终解决方案。可能会帮助某人

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

结合Steph Locke的建议,您可以使用以下方法检查是否存在扩展过程:

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'  
)

我相信有一个相应的更新过程:
sp\u updateextendedproperty
似乎有
sp\u updateextendedproperty
sp\u dropextendedproperty
。我将尝试它们。
sp\u updateextendedproperty
drop和update过程在属性不存在时抛出异常,如果属性已经存在则添加sp抛出异常。我尝试了
尝试添加catch update
逻辑,但不知何故它导致了数据库锁定。执行“回滚”锁后,锁消失,但处理此简单操作的事务不必要地复杂。我们最好检查扩展属性是否存在。这会有帮助吗?为什么
选择top 1
?它看起来很可怕,也不比
SELECT*
习惯好多少。我在创建带有“exists”的半联接时就是这样做的。我的印象是,在这种情况下,它会产生性能差异。在上面的例子中,它显然不是。@Martin Smith有趣的东西,谢谢你。我尽量避免在我的SQL代码中出现不必要的错误,所以我将对其进行修改。编辑了我的答案。