错误调用时从另一个存储过程

问题描述:

我尝试扩展属性添加到我的表和列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字符**长度 - 通常**不**你想要什么!所以**总是**使用长度!所以你的表和列的名称以及描述都被**截断**为一个**单个字符!** –

我改变了我的存储过程作为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