2011-09-17 5 views
0

ご了承いただきありがとうございます...私はSQLの専門家ではありません。 使用してSQL Server 2005の更新その他 - 挿入されていないパラメータが必要ですエラーが発生しました

2つのテーブル - LeadsMeetings。 If Exists Update else Insertを使用してレコードを更新/作成しようとしています。

MeetingテーブルにLeads_IDの列があり、それが更新された場合は、挿入がミーティングテーブルにレコードを持っているかどうかを確認するために使用します。

このSPを実行すると、 'expectsパラメータ' @ID 'が表示されますが、'エラーは発生しましたが、IDを渡しています。

ALTER PROCEDURE [dbo].[leadfollowup] 
    @ID AS NVARCHAR(55), 
    @NAME AS nvarchar (50) 
AS 
    IF EXISTS(SELECT * FROM MEETINGS WHERE LEADS_ID = @ID) 
BEGIN 
SET NOCOUNT ON; 

    UPDATE MEETINGS SET name = (SELECT TOP 1 FIRST_NAME FROM LEADS ORDER BY DATE_MODIFIED DESC) 
    WHERE LEADS_ID = @ID 

IF @@ROWCOUNT=0 

INSERT INTO MEETINGS (LEADS_ID,NAME) 
SELECT TOP 1 L.ID, first_name +' '+Last_name +' 'as NAME 
FROM LEADS_CSTM lc 
JOIN LEADS l on l.id = lc.id_c WHERE FOLLOW_UP_DATE_C >getdate() 
ORDER BY l.date_modified Desc 
END 

ありがとうございました。

答えて

0

パラメータに等しいリードIDに一致する会議のテーブルの行がある場合、あなたのロジックが

で、私が正しくあなたのprocのを読んでいると仮定すると、私たちは「ジャンクの束を」やろうとしています。会議が存在しない場合、else節はありません。

私はそれがあなたの問題に関連しているとは思わないが、それは私に飛び出した最初のものだ。私は私が...ブロックは

ALTER PROCEDURE [dbo].[leadfollowup] 
@ID AS NVARCHAR(55), 
-- this parameter is never used 
@NAME AS nvarchar (50) 
AS 
BEGIN 
    SET NOCOUNT ON 
    IF EXISTS(SELECT * FROM MEETINGS WHERE LEADS_ID = @ID) 
    BEGIN 
     SET NOCOUNT ON; 

     UPDATE 
      MEETINGS 
     SET name = 
      -- this logic probably is incorrect in a concurrent system 
      (SELECT TOP 1 FIRST_NAME FROM LEADS ORDER BY DATE_MODIFIED DESC) 
      -- this is also probably where you'd use @name parameter 
     WHERE LEADS_ID = @ID 

    END 
    ELSE 
    BEGIN 
     INSERT INTO 
      MEETINGS 
     (
      LEADS_ID 
     , NAME 
     ) 
     SELECT TOP 1 
      L.ID 
     , first_name +' '+Last_name +' 'as NAME 
     FROM LEADS_CSTM lc 
      JOIN LEADS l 
      ON l.id = lc.id_c 
     WHERE 
      FOLLOW_UP_DATE_C >getdate() 
     ORDER BY 
      l.date_modified Desc 
    END 
END 
1
ALTER PROCEDURE [dbo].[leadfollowup] 
    @ID AS NVARCHAR(55), 
    @NAME AS nvarchar (50) 
AS 
SET NOCOUNT ON; 

IF EXISTS(SELECT LEADS_ID FROM MEETINGS WHERE LEADS_ID = @ID) 
    BEGIN 

     UPDATE MEETINGS SET name = (SELECT TOP 1 FIRST_NAME FROM LEADS ORDER BY DATE_MODIFIED DESC) 
     WHERE LEADS_ID = @ID 

    END 
ELSE 
    BEGIN 

    INSERT INTO MEETINGS (LEADS_ID,NAME) 
    SELECT TOP 1 L.ID, first_name +' '+Last_name +' 'as NAME 
    FROM LEADS_CSTM lc 
    JOIN LEADS l on l.id = lc.id_c WHERE FOLLOW_UP_DATE_C >getdate() 
    ORDER BY l.date_modified Desc 

    END 
0

どここれは私はそれが動作します思い付いたものですPROCであなたの意図を推測を取り、それを明示的にするために、BEGIN/ENDのprocsのを使用してコードをリセットそれが最善の答えかどうかわからない。

ALTER PROCEDURE [dbo].[leadfollowup] 
AS 
Declare @ID NVARCHAR (55) 
set @ID = (Select top 1 ID from leads order by Date_Modified desc) 

Declare @NAME NVARCHAR (50) 
set @NAME = (select top 1 first_name +' '+Last_name +' 'as NAME from leads order by Date_Modified desc) 

SET NOCOUNT ON; 

SELECT LEADS_ID FROM MEETINGS WHERE LEADS_ID = (Select top 1 ID from leads order by Date_Modified desc) 
IF EXISTS(SELECT LEADS_ID FROM MEETINGS WHERE LEADS_ID = @ID) 

BEGIN 

UPDATE MEETINGS SET name = @NAME WHERE ID = @ID 

END 

ELSE 

BEGIN 
INSERT INTO MEETINGS (leads_ID,Name) 
values(@ID,@NAME) 
END 
関連する問題