2011-09-17 55 views
0

感謝您的耐心......我不是SQL專家,非常感謝您的幫助。 使用SQL Server 2005更新else插入 - 期望未提供參數的參數

兩張表 - LeadsMeetings。我試圖使用If Exists Update else Insert來更新/創建記錄。

我在Meeting表中有Leads_ID列,並使用它來檢查會議表中是否有記錄,如果它更新否則插入。

運行此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 

感謝您的幫助。

回答

0

假設我在正確讀你的PROC,你的邏輯是

如果有在上引線ID等於參數匹配的會議表中的行,我們要做的「一堆垃圾」 。如果會議不存在,則沒有其他條款。

我不認爲這是與你的問題有關,但它是第一件事就跳出來對我。我參加了一個猜測你的意圖與proc和使用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 
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

這是我想出了工作重設代碼...我不知道它是否是最好的答案。

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 
相關問題