Обновить еще Вставить - ожидает параметр, который не был предоставлен ошибка - PullRequest
0 голосов
/ 17 сентября 2011

Спасибо за ваше терпение ... Я не эксперт по SQL и благодарен за вашу помощь. Использование SQL Server 2005

Две таблицы - Leads и Meetings. Я пытаюсь обновить / создать запись с помощью If Exists Update else Insert.

У меня есть столбец Leads_ID в таблице Meeting, и я использую его, чтобы проверить, есть ли у лидера запись в таблице собраний, если она обновляется, иначе вставьте.

При запуске этого SP я получаю сообщение об ошибке «параметр ожидает» @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 ]

1 голос
/ 17 сентября 2011
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 голосов
/ 19 сентября 2011

Это то, что я придумал, это работает ... Я не знаю, лучший ли это ответ.

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 
0 голосов
/ 17 сентября 2011

Если я правильно читаю ваш процесс, ваша логика

Если в таблице собраний есть строка, совпадающая по идентификаторам лидов, равному параметру, мы собираемся выполнить «кучу мусора». Если встреча не существует, не существует никакого другого условия.

Не думаю, что это связано с вашей проблемой, но это первое, что бросилось в глаза. Я догадался о ваших намерениях с процедурой и сбросил код с помощью процедур BEGIN / END, чтобы было ясно, где находятся блоки

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 
...