Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从另一个存储过程调用sp_addextendedproperty时出错_Sql Server_Stored Procedures_Extended Properties - Fatal编程技术网

Sql server 从另一个存储过程调用sp_addextendedproperty时出错

Sql server 从另一个存储过程调用sp_addextendedproperty时出错,sql-server,stored-procedures,extended-properties,Sql Server,Stored Procedures,Extended Properties,我尝试将扩展属性添加到表和列中,但由于SQL Server将添加和更新存储过程分开,并且我的案例需要太多未使用的参数,因此我决定为这两个存储过程创建包装器,以便在表和列级别创建添加或更新只需要3个参数的描述。这是我当前的代码: CREATE PROCEDURE sp_addorupdatedesc @tableName varchar, @columnName varchar = NULL, @objectDescription varchar AS BEGIN

我尝试将扩展属性添加到表和列中,但由于SQL Server将添加和更新存储过程分开,并且我的案例需要太多未使用的参数,因此我决定为这两个存储过程创建包装器,以便在表和列级别创建添加或更新只需要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 OBJNAME=@tableName)
        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 T.NAME=@tableName 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”上不允许使用扩展属性,或者对象不存在


我按照marc_的建议更改了存储过程,现在可以正常工作了

这可能是一个笨拙的错误,但我希望,如果有人需要在一个存储过程中使用仅3个参数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 OBJNAME=@tableName)
                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 T.NAME=@tableName AND C.name = @columnName)
                BEGIN
                    EXECUTE  sp_addextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName
                    --EXECUTE   sp_addextendedproperty @name=N'CXC_DESCRIPTION', @value=N@temp3, @level0type=N'user', @level0name=N'dbo', @level1type=N'table', @level1name=N@temp1, @level2type=N'column', @level2name=N@temp2
                END
            ELSE
                BEGIN
                    EXECUTE   sp_updateextendedproperty 'MY_DESCRIPTION', @objectDescription, 'user', dbo, 'table', @tableName, 'column', @columnName
                END
        END 
END
GO

旁注:存储过程不应使用sp_uu前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用sp_u,并使用其他东西作为前缀——或者根本不使用前缀!感谢您的建议-您应该始终为您使用的任何varchar变量和参数提供长度。当您将一个参数定义为varchar(没有任何长度)时,它默认为正好1个字符的长度-通常不是您想要的!因此,请始终使用长度!!因此,表名、列名以及描述都被截断为单个字符!啊。。。所以这个错误是因为大小。。。。在我改变了varchar的大小后,这个sp就可以工作了!再次感谢你的另一个建议:D