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"形式传递所有后续参数.
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)
此外,由于您要传递此语句,因此必须转义单引号以避免错误.