2012-03-22 88 views
2

我有試圖讓這個查詢工作的問題,我不斷收到錯誤,這裏是代碼,之後相關的錯誤有問題,有檢查,如果功能已經存在

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 

錯誤

消息119,級別15,狀態1,行8
必須將參數2和後續參數作爲'@name = value'傳遞。
使用表單'@name = value'後,所有後續參數 必須以'@name = value'的形式傳遞。

回答

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 

此外,由於您傳遞此語句,單引號必須轉義以避免錯誤。

+0

謝謝你,先生,這工作 – user710502 2012-03-22 06:07:21

+0

我試過這在SQLFiddle並得到錯誤。你需要修改你的代碼:declare @statement nvarchar(4000),你爲什麼在聲明中有**?如果您打算通過SO進行粗體顯示,那麼在代碼塊內不起作用 – 2012-03-22 06:12:48

+0

感謝您的觀察。我修復了代碼以備將來參考。 – 2012-03-22 06:15:31