0

Мне нужно полуавтоматизировать расширенное обновление свойств и то, что я планировал сделать, правильно или неправильно, состоит в том, чтобы заполнить временную таблицу всеми данными, а затем каким-то образом присоединиться к временной таблице когда вы проверяете, существует ли значение. Затем я хочу выполнить итерацию по каждой строке во временной таблице, и если это значение существует, вызовите функцию 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

Это один из очень немногих случаев, когда я сказал бы это, но решение использовать курсор. Просто создайте цикл курсора для вашей переменной таблицы и запустите свой существующий запрос внутри цикла. Я сделал эту очень точно такую ​​же логику раньше, и она должна работать нормально.

+0

ok Я принял ваш совет и написал вышеприведенный скрипт, но теперь я получаю эту ошибку - Msg 15217, Level 16, State 2, Procedure sp_updateextendedproperty, строка 36 Невозможно обновить или удалить свойство. Свойство «MS_Description» не существует для «dbo.tblHAEMATOLOGY_MDT.MEETING_ID». - У меня есть синтаксическая ошибка где-то? –

+0

Я ничего не вижу, и у меня нет настройки передо мной прямо сейчас, чтобы запустить код. на данный момент, закомментируйте свои вызовы хранимым процедурам и поставьте в операторах выбора, чтобы вы могли видеть, что вещи оценивают. возвращать результаты из существующего запроса и помещать «select» update, @TableName, @ColumnName и один для вставки. моя лучшая догадка заключается в том, что что-то не так с вашим соединением extended_properties, но ничего не выглядит. –

+0

это была проблема с данными, но после сортировки, опция курсора, повторяющаяся через временную таблицу, работает как сон - спасибо приятелю –

 Смежные вопросы

  • Нет связанных вопросов^_^