使用临时表扩展属性批量更新

Posted

技术标签:

【中文标题】使用临时表扩展属性批量更新【英文标题】:extended property mass update using temporary table 【发布时间】:2016-03-18 15:46:30 【问题描述】:

我需要半自动化扩展属性更新,无论对错,我打算用所有数据填充临时表,然后在检查值是否以某种方式加入临时表已经存在。 然后我想遍历临时表中的每一行,如果值存在,调用函数sp_updateextendedproperty,如果不调用函数sp_addextendedproperty。下面是我的出发点,什么会使这项工作?

DECLARE @Table TABLE (id int IDENTITY(1,1),TableName SYSNAME, ColumnName varchar(200), ColumnDescription varchar(200))

INSERT INTO @Table VALUES('MyTable', 'Col1', 'Col1 description')
INSERT INTO @Table VALUES('MyTable', 'Col2', 'Col2 description')

IF EXISTS 
(select 
    sc.name,
    sep.value
from sys.tables st
inner join sys.columns sc on st.object_id = sc.object_id
left join sys.extended_properties sep on st.object_id = sep.major_id
                                 and sc.column_id = sep.minor_id
                                 and sep.name = 'MS_Description'
where st.name = @Table.TableName and sc.name = @Table.ColumnName and sep.value is not null)

EXEC sp_updateextendedproperty 
@name = N'MS_Description', @value = @Table.ColumnDescription,
@level0type = N'Schema', @level0name = 'dbo', 
@level1type = N'Table',  @level1name = @Table.TableName, 
@level2type = N'Column', @level2name = @Table.ColumnName

ELSE

EXEC sp_addextendedproperty 
@name = N'MS_Description', @value = @Table.ColumnDescription,
@level0type = N'Schema', @level0name = 'dbo',
@level1type = N'Table', @level1name = @Table.TableName, 
@level2type = N'Column', @level2name = @Table.ColumnName

新脚本

CREATE TABLE updateTable (TableName SYSNAME, ColumnName varchar(100), ColumnDescription varchar(100))

INSERT INTO updateTable VALUES('tblHAEMATOLOGY_MDT', 'MDT_ID', 'row1 test run')
INSERT INTO updateTable VALUES('tblHAEMATOLOGY_MDT', 'MEETING_ID', 'row2 test run')

DECLARE @TableName SYSNAME, @ColumnName varchar(100), @ColumnDescription varchar(100)
DECLARE @UpdateCursor CURSOR

SET @UpdateCursor = CURSOR FOR
SELECT TableName, ColumnName, ColumnDescription FROM updateTable

OPEN @UpdateCursor

FETCH NEXT FROM @UpdateCursor INTO @TableName, @ColumnName, @ColumnDescription

WHILE @@FETCH_STATUS = 0
BEGIN

IF EXISTS 
(select 
    sc.name,
    sep.value
from sys.tables st
inner join sys.columns sc on st.object_id = sc.object_id
left join sys.extended_properties sep on st.object_id = sep.major_id
                                 and sc.column_id = sep.minor_id
                                 and sep.name = 'MS_Description'
left join updateTable on st.name = @TableName and sc.name = @ColumnName
where sep.value is not null)

BEGIN

EXEC sp_updateextendedproperty 
@name = N'MS_Description', @value = @ColumnDescription,
@level0type = N'Schema', @level0name = 'dbo', 
@level1type = N'Table',  @level1name = @TableName, 
@level2type = N'Column', @level2name = @ColumnName

FETCH NEXT FROM @UpdateCursor INTO @TableName, @ColumnName, @ColumnDescription

END

ELSE

BEGIN

EXEC sp_addextendedproperty 
    @name = N'MS_Description', @value = @ColumnDescription,
    @level0type = N'Schema', @level0name = 'dbo',
    @level1type = N'Table', @level1name = @TableName, 
    @level2type = N'Column', @level2name = @ColumnName

FETCH NEXT FROM @UpdateCursor INTO @TableName, @ColumnName, @ColumnDescription

END

END

CLOSE @UpdateCursor
DEALLOCATE @UpdateCursor

【问题讨论】:

【参考方案1】:

这是我要说的极少数情况之一,但解决方案是使用光标。只需针对您的表变量创建一个游标循环并在循环内运行您的存在查询。我以前做过这个完全相同的逻辑,它应该可以正常工作。

【讨论】:

好的,我听取了您的建议并编写了上述脚本,但现在我收到此错误 - 消息 15217,级别 16,状态 2,过程 sp_updateextendedproperty,第 36 行属性无法更新或删除。 “dbo.tblHAEMATOLOGY_MDT.MEETING_ID”的属性“MS_Description”不存在。 - 我在某处遇到语法错误吗? 我没有看到任何临时的东西,而且我现在没有设置来运行代码。现在,注释掉对存储过程的调用并放入 select 语句,这样您就可以看到正在评估的内容。从存在查询返回结果,并放入一个“选择'更新',@TableName,@ColumnName”和一个用于插入。我最好的猜测是您的 extended_properties 连接有问题,但没有任何问题。 这是一个数据问题,但在排序之后,遍历临时表的游标选项就像做梦一样 - 谢谢好友

以上是关于使用临时表扩展属性批量更新的主要内容,如果未能解决你的问题,请参考以下文章

2.7原型链模式扩展-批量设置公有属性

访问表的扩展属性

你调用的对象是空的。 (SqlMgmt) 使用 SSMS 向导更新扩展属性时

列出表和表扩展属性

材料表类型错误:无法添加属性表数据,对象不可扩展

如何摆脱 SQL Server 2000 中的扩展表属性?