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代码中出现不必要的错误,所以我将对其进行修改。编辑了我的答案。