Проблема с удалением функции в 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
,