Mam następujący wyzwalacz Microsoft SQL Server dla mojego stołu:

-- Insert statements for trigger here
DECLARE @AssignmentUID uniqueidentifier;
DECLARE @ResourceUID uniqueidentifier;
DECLARE @ResourceName nvarchar(255);
DECLARE @ResourceClaimsAccount nvarchar(255);
DECLARE @ProjectUID uniqueidentifier;
DECLARE @ProjectName nvarchar(255);
DECLARE @ProjectUrl nvarchar(1000);
DECLARE @TaskUID uniqueidentifier;
DECLARE @TaskName nvarchar(255);
DECLARE @TaskUrl nvarchar(1000);
DECLARE @UserId nvarchar(255);
DECLARE @PWAUrl nvarchar(255);
DECLARE @sql varchar(8000)

SELECT @AssignmentUID = INSERTED.AssignmentUID 
FROM INSERTED;

SELECT        
    @TaskUID = MSP_EpmAssignment_UserView.TaskUID,
    @TaskName = MSP_EpmTask_UserView.TaskName, 
    @ProjectUID = MSP_EpmAssignment_UserView.ProjectUID, 
    @ProjectName = MSP_EpmProject_UserView.ProjectName, 
    @ProjectUrl = MSP_EpmProject_UserView.ProjectWorkspaceInternalHRef, 
    @ResourceUID = MSP_EpmAssignment_UserView.ResourceUID, 
    @ResourceClaimsAccount = MSP_EpmResource_UserView.UserClaimsAccount, 
    @ResourceName = MSP_EpmResource_UserView.ResourceName
FROM
    MSP_EpmAssignment_UserView 
LEFT OUTER JOIN
    MSP_EpmResource_UserView ON MSP_EpmAssignment_UserView.ResourceUID = MSP_EpmResource_UserView.ResourceUID 
LEFT OUTER JOIN
    MSP_EpmProject_UserView ON MSP_EpmAssignment_UserView.ProjectUID = MSP_EpmProject_UserView.ProjectUID 
LEFT OUTER JOIN
    MSP_EpmTask_UserView ON MSP_EpmAssignment_UserView.TaskUID = MSP_EpmTask_UserView.TaskUID
WHERE
    (MSP_EpmAssignment_UserView.AssignmentUID = @AssignmentUID);

INSERT INTO tablename
(ItemTitle, ParentName, ParentUrl, Loginname, SourceId, CreatedAt)
VALUES (@TaskName, @ProjectName, @ProjectUrl, RIGHT(@ResourceClaimsAccount, CHARINDEX('\', REVERSE('\' + @ResourceClaimsAccount)) - 1), 1, GETDATE());

Jak mogę sprawdzić, czy @assignmentuid i @taskuid nie jest null przed wykonaniem instrukcji wkładki? Czy istnieje również potencjał do optymalizacji tego spustu?

1
STORM 16 luty 2017, 16:50

2 odpowiedzi

Najlepsza odpowiedź

Musisz napisać swój spust w modzie opartych na , aby obsłużyć fakt, że tabela Inserted może zawierać wiele wierszy.

Wypróbuj ten kod - używa twojego rdzenia SELECT i wykonuje INNER JOIN do tabeli Inserted na tej kolumnie, którą próbowałeś złapać na początku. Spowoduje to obsługę rzędów wszystkie , które są zawarte w tabeli Inserted naraz - bez zapętlenia, brak kursora - nie potrzebny jest taki bałagan!

INSERT INTO tablename (ItemTitle, ParentName, ParentUrl, Loginname, SourceId, CreatedAt)
SELECT        
    MSP_EpmTask_UserView.TaskName, 
    MSP_EpmProject_UserView.ProjectName, 
    MSP_EpmProject_UserView.ProjectWorkspaceInternalHRef, 
    RIGHT(MSP_EpmResource_UserView.UserClaimsAccount, CHARINDEX('\', REVERSE('\' + MSP_EpmResource_UserView.UserClaimsAccount)) - 1,
    1, 
    SYSDATETIME()
FROM
    MSP_EpmAssignment_UserView 
INNER JOIN
    Inserted i ON MSP_EpmAssignment_UserView.AssignmentUID = i.AssignmentUID 
LEFT OUTER JOIN
    MSP_EpmResource_UserView ON MSP_EpmAssignment_UserView.ResourceUID = MSP_EpmResource_UserView.ResourceUID 
LEFT OUTER JOIN
    MSP_EpmProject_UserView ON MSP_EpmAssignment_UserView.ProjectUID = MSP_EpmProject_UserView.ProjectUID 
LEFT OUTER JOIN
    MSP_EpmTask_UserView ON MSP_EpmAssignment_UserView.TaskUID = MSP_EpmTask_UserView.TaskUID
3
marc_s 16 luty 2017, 13:58
IF (@AssignmentUID IS NOT NULL AND @TaskUID IS NOT NULL)
BEGIN 
  ...
END
1
Kostis 16 luty 2017, 13:52