检查功能是否已存在时遇到问题

use*_*502 2 sql sql-server-2008

我遇到了尝试使此查询工作的问题,我不断收到错误,这是代码,然后是相关的错误

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
Run Code Online (Sandbox Code Playgroud)

错误

消息119,级别15,状态1,行8
必须将参数编号2和后续参数作为"@name = value"传递.
在使用"@name = value"形式之后,必须以"@name = value"形式传递所有后续参数.

Edd*_*Paz 6

SQL Server将此视为一个代码块,因此"创建函数"将失败.因此,在做了Justin建议之后你得到的错误.

要以这种方式(打印消息等),您必须按照最初的方式执行该语句.除非您必须先设置文本:

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 
Run Code Online (Sandbox Code Playgroud)

此外,由于您要传递此语句,因此必须转义单引号以避免错误.