更新else插入 - 期望未提供的参数错误

时间:2011-09-17 18:59:15

标签: sql-server-2005 insert if-statement

感谢您的耐心等待......我不是SQL方面的专家,非常感谢您的帮助。 使用SQL Server 2005

两个表格 - LeadsMeetings。我正在尝试使用If Exists Update else Insert来更新/创建记录。

我在Leads_ID表中有一个Meeting列,并使用它来检查会员表中是否有记录,如果它确实更新,否则插入。

运行此SP我得到'expected参数'@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 

感谢您的帮助。

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

假设我正确阅读你的过程,你的逻辑是

如果会议表中的某一行与潜在客户ID相匹配,那么我们将会做“一堆垃圾”。如果会议不存在,则没有其他条款。

我不认为这与你的问题有关,但这是我第一次跳出来。我用proc来猜测你的意图并使用BEGIN / END procs重置代码,使其明确显示块的位置

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 

答案 2 :(得分:0)

这就是我想出来的作品......我不知道它是否是最好的答案。

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