2015-08-30 41 views
-2

現在我使光標更新爲2個表,並根據特定的select語句在一個表中插入此select語句返回2列x,yi需要x在表「PX」中更新,因爲x是此表中的主鍵並且需要x在表「FX」中更新,因爲x在此表中是外鍵,然後在第三個表中插入x數據。每個更新行的SQL插入語句

我需要改變這個遊標,並使用更新和插入腳本我試過,但我發現我需要做循環來實現我的目標,所以如果任何人知道我是否可以改變這個遊標。

而且由於事先

DECLARE @id int 
DECLARE @clientid uniqueidentifier 
DECLARE @code int 
DECLARE @Wtime int 

DECLARE @closeComplaint CURSOR 
SET @closeComplaint = CURSOR FAST_FORWARD 
FOR 
    SELECT ComplaintId, [ClientId] 
    FROM complaint 
    WHERE ComplaintStatusId = 5 
     AND (waitingForCutomerCloseDateTime < GETDATE() OR 
      waitingForCutomerCloseDateTime = GETDATE()) 

OPEN @closeComplaint 

FETCH NEXT FROM @closeComplaint INTO @id, @clientid 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT 
     waitingForCutomerCloseTime = @Wtime 
    FROM 
     SystemConfiguration 
    WHERE 
     ClientId = @clientid 

    SELECT 
     [Code] = @code 
    FROM 
     [dbo].[resp_users] 
    WHERE 
     ClientId = @clientid 

    UPDATE activity 
    SET ActivityStatus = 4, 
     CompletionDate = GETDATE(), 
     ClosedBy = @code 
    WHERE [ComplaintId] = @id 

    UPDATE [dbo].[Complaint] 
    SET ComplaintStatusId = 2 
    WHERE [ComplaintId] = @id 

    INSERT INTO [dbo].[Note] ([Note_Description], [ClientId], [User_Code], [Visible_Internal], 
           [ComplaintId], [Note_DateTime], [ComplainantId], 
           [OneStopDesk_CustomerEmail], [OneStopDesk_CustomerUsername], [Private]) 
    VALUES (N'Automatically closed by system after ' + @Wtime, @clientid, @code, 1, 
      @id, GETDATE(), null, null, null, 1) 

    FETCH NEXT FROM @closeComplaint INTO @id, @clientid 
END 

CLOSE @closeComplaint 
DEALLOCATE @closeComplaint 
+4

沒有看到您的代碼,我們真的不能就如何修改它提出任何建議。編輯你的問題,幷包括代碼。 –

+0

爲什麼你包含C#標籤?這看起來像一個純粹的SQL。 –

+0

我添加了我的sql代碼@marc_s – NOOR

回答

0

我不完全確保我得到的一切權利(你沒有張貼表結構,因此,有時如何將這些表我真的可以只猜測 - 但你應該可以基本上做到這一點在3簡單,基於設置的語句 - 這應該是一個LOT比光標更快!

-- declare table variable 
DECLARE @Input TABLE (CompaintID INT, ClientID INT) 

-- save the rows into a table variable 
INSERT INTO @Input (ComplaintID, ClientID) 
    SELECT ComplaintID, ClientID 
    FROM dbo.Complaint 
    WHERE ComplaintStatusId = 5 
    AND waitingForCustomerCloseDateTime <= GETDATE() 

UPDATE a 
SET ActivityStatus = 4, 
    CompletionDate = GETDATE(), 
    ClosedBy = u.Code 
FROM dbo.Activity a 
INNER JOIN @Input i ON a.ComplaintId = i.ComplaintId 
INNER JOIN dbo.resp_users u ON i.ClientId = u.ClientId 

UPDATE dbo.Complaint 
SET ComplaintStatusId = 2 
WHERE 
    ComplaintStatusId = 5 
    AND waitingForCustomerCloseDateTime <= GETDATE() 

INSERT INTO dbo.Note ([Note_Description], [ClientId], [User_Code], [Visible_Internal], 
         [ComplaintId], [Note_DateTime], [ComplainantId], 
         [OneStopDesk_CustomerEmail], [OneStopDesk_CustomerUsername], [Private]) 
    SELECT 
     N'Automatically closed by system after ' + sc.waitingForCustomerCloseTime, 
     i.ClientId, u.Code, 1, 
     i.ComplaintId, GETDATE(), null, null, null, 1 
    FROM 
     @Input i 
    INNER JOIN 
     dbo.SystemConfiguration sc ON i.ClientId = sc.ClientId 
    INNER JOIN 
     dbo.resp_user u ON u.ClientId = i.ClientId 
+0

:)謝謝@marc_s – NOOR