2015-08-30 6 views
-2

Теперь я сделал курсор для обновления в 2 таблицах и вставлял в одну таблицу на основе конкретного оператора select, этот оператор select возвращает 2 столбца x, yi нужно x обновить в таблице «PX», поскольку x is Первичный ключ в этой таблице и нужно 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

Смежные вопросы