Возникли проблемы с проверкой, если функция уже существует - PullRequest
2 голосов
/ 22 марта 2012

У меня проблемы с попыткой заставить этот запрос работать, я получаю ошибки, вот код и после этого связанная ошибка

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ConcatNames]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
BEGIN

   EXECUTE dbo.sp_executesql @statement = N'
      create function dbo.ConcatNames(@ProdId int) returns varchar(8000)
      as
      begin 
      declare @output varchar(8000)
      select @output = coalesce(@output + ', ', '') + Name
      from Reports
      where ProdID = @ProdId and Name > ''
      return @output
      end'
     PRINT N'Created function ConcatNames'
  END
  ELSE
  BEGIN
    PRINT N'function ConcatAttributeNames Already Exists'
  END

Ошибка

Msg119, Уровень 15, Состояние 1, Строка 8
Должен передать номер параметра 2 и последующие параметры как '@name = значение'.
После использования формы '@name = значение' все последующие параметры должны бытьпередается в виде «@name = значение».

1 Ответ

6 голосов
/ 22 марта 2012

SQL Server видит это как один блок кода, поэтому «создать функцию» не удастся.Отсюда и ошибка, которую вы получаете после выполнения того, что предложил Джастин.

Чтобы сделать это таким образом (печать сообщений и т. Д.), Вы должны выполнить инструкцию так, как она была у вас изначально.За исключением того, что вы должны сначала установить текст:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[ConcatAttributeNames]') AND
 type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
BEGIN 

    declare @statement nvarchar(4000)

    set @statement = N'
    create function [dbo].[ConcatAttributeNames] (@prodId int) returns varchar(8000) 
    as 
    begin  
        declare @output varchar(8000)

        select @output = coalesce(@output + '', '', '''') + AttributeName 
        from Report_Attribute 
        where ProdID = @ProdId and AttributeName > '''' 

        return @output 
    end '

    exec sp_executesql @statement

    PRINT N'Created function ConcatAttributeNames' 
END 
ELSE 
BEGIN 
    PRINT N'function ConcatAttributeNames Already Exists' 
END 

Кроме того, поскольку вы передаете этот оператор, одинарные кавычки должны быть экранированы, чтобы избежать ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...