2012-03-22 4 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 

エラー

メッセージレベル15、状態1、行8
パラメータ番号2以降のパラメータを '@name = value'として渡す必要があります。
フォーム '@name = value'を使用した後、すべての後続パラメータ を '@name = value'の形式で渡す必要があります。

答えて

6

SQL Serverはこれを1つのコードブロックとして認識しているため、「create function」は失敗します。したがって、あなたは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

+0

これをSQLFiddleで試してみましたが、エラーが発生しました。コードを変更する必要があります:declare @statement nvarchar(4000)そしてなぜあなたは宣言の周りに**持っていますか?あなたがSOを介して太字にすることを意図した場合、それはコードブロック内では機能しません –

+0

観測に感謝します。私は将来の参照のためにコードを修正しました。 –

関連する問題