错误调用时从另一个存储过程
问题描述:
我尝试扩展属性添加到我的表和列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”不允许扩展属性,或者该对象不存在。
答
我改变了我的存储过程作为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
备注:您应该**不要**为存储过程使用'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_'并将其他内容用作前缀 - 或者根本没有前缀! –
感谢您sugestion – Angga
[不良习惯踢:宣布不VARCHAR(长度)](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring- varchar-without-length.aspx) - 你应该总是**为你使用的任何'varchar'变量和参数提供一个长度。当你将一个**参数**定义为'varchar'时 - 没有任何长度 - 它默认为**正确1字符**长度 - 通常**不**你想要什么!所以**总是**使用长度!所以你的表和列的名称以及描述都被**截断**为一个**单个字符!** –