2017-01-31 6 views
0

Я пытаюсь добавить расширенные свойства в таблицу и столбец, но поскольку SQL Server отделяет хранимую процедуру добавления и обновления и требует слишком много неиспользуемых параметров для моего случая, я решил создать оболочку для этих 2 хранимых процедур, поэтому я могу создать описание только с 3 параметрами, необходимыми для добавления или обновления на уровне таблицы и столбца. Это мой текущий код:Ошибка при вызове sp_addextendedproperty из другой хранимой процедуры

CREATE PROCEDURE sp_addorupdatedesc 
    @tableName varchar, 
    @columnName varchar = NULL, 
    @objectDescription varchar 
AS 
BEGIN 
    IF (@columnName IS NULL) 
    BEGIN 
     IF NOT EXISTS (SELECT 1 FROM fn_listextendedproperty (NULL, 'user', 'dbo', 'table', default, NULL, NULL) WHERE [email protected]) 
     BEGIN 
      EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
     END 
     ELSE 
     BEGIN 
      EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
     END 
    END 
    ELSE 
    BEGIN 
     IF NOT EXISTS (SELECT 1 
         FROM sys.extended_properties AS ep 
         INNER JOIN sys.tables AS t ON ep.major_id = t.object_id 
         INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id 
         WHERE class = 1 AND [email protected] AND C.name = @columnName) 
     BEGIN 
      EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
     END 
     ELSE 
     BEGIN 
      EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
     END 
    END 
END 
GO 

Но когда я использую эту хранимую процедуру, я получаю эту ошибку вместо:

Msg 15135, уровень 16, состояние 8, процедура sp_addextendedproperty, Линия 58
Объект является инвалид. Расширенные свойства не разрешены на 'dbo.P.P', или объект не существует.

+0

Замечание: вы должны ** не использовать ** префикс 'sp_' для хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

спасибо за ваше предложение – Angga

+1

[Плохие привычки пинать: объявление VARCHAR без (длина)] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring- varchar-without-length.aspx) - вы всегда должны ** предоставлять длину для любых переменных и параметров varchar, которые вы используете. Когда вы определяете ** параметр ** как 'varchar' - без какой-либо длины, он по умолчанию имеет значение ** EXACTLY 1 CHARACTER ** length - обычно ** NOT **, что вы хотите! Так что ** всегда ** используйте длину !! Таким образом, ваши имена таблиц и столбцов, а также описание все получаются ** усеченными ** до ** одного символа! ** –

ответ

0

Я изменил свою хранимую процедуру как предложенную marc_S, и теперь она работает.

Это может быть неуклюжая ошибка, но я надеюсь, что если кому-то понадобится упростить добавление или обновление расширенного свойства в таблицу или столбец в одной хранимой процедуре только с тремя параметрами «TableName», «ColumnName», «Description».

Вот код.

CREATE PROCEDURE setdescription 
    @tableName varchar(100), 
    @columnName varchar(100) = NULL, 
    @objectDescription varchar(250) 
AS 
BEGIN 
    IF (@columnName IS NULL) 
     BEGIN 
      IF NOT EXISTS (SELECT 1 FROM fn_listextendedproperty (NULL, 'user', 'dbo', 'table', default, NULL, NULL) WHERE [email protected]) 
       BEGIN 
        EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
       END 
      ELSE 
       BEGIN 
        EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, default, NULL 
       END 
     END 
    ELSE 
     BEGIN 
      IF NOT EXISTS (SELECT 1 FROM sys.extended_properties AS ep 
           INNER JOIN sys.tables AS t ON ep.major_id = t.object_id 
           INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id 
           WHERE class = 1 AND [email protected] AND C.name = @columnName) 
       BEGIN 
        EXECUTE sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
        --EXECUTE sp_addextendedproperty @name=N'CXC_DESCRIPTION', @[email protected], @level0type=N'user', @level0name=N'dbo', @level1type=N'table', @[email protected], @level2type=N'column', @[email protected] 
       END 
      ELSE 
       BEGIN 
        EXECUTE sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName 
       END 
     END 
END 
GO 
Смежные вопросы