2017-01-31 50 views
0

我嘗試擴展屬性添加到我的表和列sp_addextendedproperty,但由於SQL服務器分開添加和更新存儲過程,並且需要太多的未使用的參數爲我的情況下,我決定創建包裝對於這2個存儲過程,所以我可以創建只有3個參數的表和列級別的添加或更新所需的描述。這是我當前的代碼:錯誤調用時從另一個存儲過程

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 

但是當我使用這個存儲過程,我得到這個錯誤,而不是:

消息15135,級別16,狀態8,過程sp_addextendedproperty,58號線
對象是無效。 「dbo.P.P」不允許擴展屬性,或者該對象不存在。

+0

備註:您應該**不要**爲存儲過程使用'sp_'前綴。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](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

感謝您sugestion – Angga

+1

[不良習慣踢:宣佈不VARCHAR(長度)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring- varchar-without-length.aspx) - 你應該總是**爲你使用的任何'varchar'變量和參數提供一個長度。當你將一個**參數**定義爲'varchar'時 - 沒有任何長度 - 它默認爲**正確1字符**長度 - 通常**不**你想要什麼!所以**總是**使用長度!所以你的表和列的名稱以及描述都被**截斷**爲一個**單個字符!** –

回答

0

我改變了我的存儲過程作爲marc_S建議和現在的工作。

這可能是一個笨拙的錯誤,但我希望如果有人需要簡化添加或更新擴展屬性到一個存儲過程的表或列只有3個參數「TableName」,「ColumnName」,「描述」。

這是代碼。

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 
相關問題