Проверьте, существует ли расширенное описание свойства перед добавлением
Итак, у меня есть скрипт, который добавляет расширенные свойства, некоторые из которых описывают таблицу, некоторые-столбец. Как я могу проверить, существует ли расширенное свойство, прежде чем добавлять его, чтобы скрипт не выдал ошибку?
4 ответа:
Этот первый скрипт проверяет, существует ли расширенное свойство, описывающее таблицу:
IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID('Table_Name') AND [name] = N'MS_Description' AND [minor_id] = 0) EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'This table is responsible for holding information.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Table_Name';
Этот второй скрипт проверяет, существует ли расширенное свойство, описывающее столбец:
IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID('Table_Name') AND [name] = N'MS_Description' AND [minor_id] = (SELECT [column_id] FROM SYS.COLUMNS WHERE [name] = 'Column_Name' AND [object_id] = OBJECT_ID('Table_Name'))) EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = N'This column is responsible for holding information for table Table_Name.', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'Table_Name', @level2type = N'COLUMN', @level2name = N'Column_Name';
Вот еще один подход к хранимым процедурам, подобный подходу Руслана К., Но он не включает в себя try / catch или явные транзакции:
-- simplify syntax for maintaining data dictionary IF OBJECT_ID ('dbo.usp_addorupdatedescription', 'P') IS NOT NULL DROP PROCEDURE dbo.usp_addorupdatedescription; GO CREATE PROCEDURE usp_addorupdatedescription @table nvarchar(128), -- table name @column nvarchar(128), -- column name, NULL if description for table @descr sql_variant -- description text AS BEGIN SET NOCOUNT ON; IF @column IS NOT NULL IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID(@table) AND [name] = N'MS_Description' AND [minor_id] = (SELECT [column_id] FROM SYS.COLUMNS WHERE [name] = @column AND [object_id] = OBJECT_ID(@table))) EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = @descr, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @table, @level2type = N'COLUMN', @level2name = @column; ELSE EXECUTE sp_updateextendedproperty @name = N'MS_Description', @value = @descr, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @table, @level2type = N'COLUMN', @level2name = @column; ELSE IF NOT EXISTS (SELECT NULL FROM SYS.EXTENDED_PROPERTIES WHERE [major_id] = OBJECT_ID(@table) AND [name] = N'MS_Description' AND [minor_id] = 0) EXECUTE sp_addextendedproperty @name = N'MS_Description', @value = @descr, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @table; ELSE EXECUTE sp_updateextendedproperty @name = N'MS_Description', @value = @descr, @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = @table; END GO
Я написал простую хранимую процедуру для добавления или обновления расширенного свойства 'MS_Description':
IF OBJECT_ID ('dbo.usp_addorupdatedescription', 'P') IS NOT NULL DROP PROCEDURE dbo.usp_addorupdatedescription; GO CREATE PROCEDURE usp_addorupdatedescription @table nvarchar(128), -- table name @column nvarchar(128), -- column name, NULL if description for table @descr sql_variant -- description text AS BEGIN SET NOCOUNT ON; DECLARE @c nvarchar(128) = NULL; IF @column IS NOT NULL SET @c = N'COLUMN'; BEGIN TRY EXECUTE sp_updateextendedproperty N'MS_Description', @descr, N'SCHEMA', N'dbo', N'TABLE', @table, @c, @column; END TRY BEGIN CATCH EXECUTE sp_addextendedproperty N'MS_Description', @descr, N'SCHEMA', N'dbo', N'TABLE', @table, @c, @column; END CATCH; END GO
Для проверки любого из расширенных свойств, доступных для данной таблицы, Используйте, как показано ниже.
IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description')
Если ваша таблица имеет более одного расширенного свойства, укажите идентификатор столбца как
minor_id
.IF EXISTS(SELECT 1 FROM sys.extended_properties WHERE [major_id] = OBJECT_ID('<schema>.<table_name>') AND [name] = N'MS_Description' AND minor_id = 3)
Запрос
sys.extended_properties
представление каталога для получения всех расширенных свойств в базе данных.Дополнительные сведения http://msdn.microsoft.com/en-us/library/ms177541(в=в SQL.110).аспн