Проблема с удалением функции в sql server rpt db

У меня проблема с удалением этой функции. Я объявляю эту функцию в 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. Любая помощь приветствуется!

Спасибо!

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` block, так что вы можете перехватывать множество ошибок, которые возникают - если вы хотите обработать их в SP.

Вам нужно переписать свой код с мыслью, что вы не можете вкладывать функции и хранимые процедуры. Вы, вероятно, должны держать эту функцию рядом. Возможно, дайте ему сложное имя, как ufn_MissMatchesReport_extract,

Другие вопросы по тегам