0

我在删除此功能时遇到问题。我在 sp 中声明这个函数:

错误:数据库中已有一个名为“extract”的对象。

IF OBJECT_ID('[rpt].[MissMatchesReport]') IS NOT NULL
BEGIN
DROP PROCEDURE [rpt].[MissMatchesReport]
END
GO
CREATE procedure [rpt].[MissMatchesReport]


as


IF object_id(N'extract', N'FN') IS NOT NULL
DROP FUNCTION extract
GO

create function [rpt].extract (@fileName varchar(1236))

returns varchar(123)
as
begin
declare @fileINS as integer = 1, @j int

while 1  = 1 
begin
SET @j = charindex('\', @fileName, @fileINS)
if @j < 1
break
SET @fileINS = @j + 1
end

return substring(@fileName, @fileINS, LEN(@filename) - @fileins+1)

end
GO

我使用这个函数来更改我创建的临时表的唯一原因。可能我应该在 sp 的末尾删除该函数吗?但是,此 SP 用于报告,因此我不确定是否在执行结束时删除 SP 是否仍会使所有内容在 SSRS 中正常工作。

我对 SSRS 和 SQL 很陌生。任何帮助表示赞赏!

谢谢!

4

1 回答 1

1

从哪儿开始。T-SQL 与其他编程语言不同。您不能嵌套存储过程和函数的定义。这是一个限制,但你很快就会习惯它。文档在这一点上非常清楚(请参阅限制和限制)。

您可能认为您是在 SP 中声明该函数,但事实并非如此。实际上,您拥有的 SP 整体如下:

CREATE procedure [rpt].[MissMatchesReport]
as
IF object_id(N'extract', N'FN') IS NOT NULL
DROP FUNCTION extract
GO

GO结束定义 SP 的批处理单元。这就是定义。(您可以在 SP 中删除函数。)函数的定义超出了 SP 的范围。

作为实践,将 SP 的主体放在begin/end块中是个好主意。将它放在begin try/end catch 块中是更好的做法(但更高级),因此您可以捕获发生的许多错误——如果您想在 SP 中处理它们。

你需要重写你的代码,因为你不能嵌套函数和存储过程。您可能应该保留该功能。也许给它一个复杂的名字,比如ufn_MissMatchesReport_extract.

于 2013-05-29T00:19:35.947 回答