SQL语句中的SQL插入

时间:2017-06-02 14:34:38

标签: sql sql-server

我在内部插入附近有语法问题。

错误消息:

  

' INSERT'附近的语法不正确

(并在评论部分中标记)。有没有人知道在case语句中插入表的方法,然后选择范围标识?

INSERT
INTO dbo.WorkOrderMasterLabor ( WorkOrderMasterID , TaskID , ContractorLaborCraftID , EmployeeLaborCraftID , Sequence , ModifiedTimestamp , ModifiedUserName )
SELECT
        (SELECT WorkOrderMasterID FROM WorkOrderMasters WHERE JobNumber = A.JOBNO),
        NULL,
        NULL,
        CASE WHEN EXISTS(
                SELECT 1
                FROM dbo.EmployeeLaborCrafts 
                WHERE EmployeeID = (
                    SELECT EmployeeID
                    FROM Employees
                    WHERE EmployeeNumber = A.EMPLOYEENO
                )
                AND LaborCraftID = (
                    SELECT LaborCraftID
                    FROM LaborCrafts
                    WHERE LaborCraftCode = A.LABORCODE
                )
            ) 
            THEN (
                SELECT EmployeeLaborCraftID
                FROM dbo.EmployeeLaborCrafts 
                WHERE EmployeeID = (
                    SELECT EmployeeID
                    FROM Employees
                    WHERE EmployeeNumber = A.EMPLOYEENO
                )
                AND LaborCraftID = (
                    SELECT LaborCraftID
                    FROM LaborCrafts
                    WHERE LaborCraftCode = A.LABORCODE
                )
            )
            ELSE (
                --syntax error at insert
                INSERT
                INTO dbo.EmployeeLaborCrafts ( EmployeeID , LaborCraftID , ModifiedTimestamp , ModifiedUserName )
                SELECT *
                FROM @PMMLABOR
                SELECT SCOPE_IDENTITY()
            ) 
        END,
        '',
        GETDATE(),
        N'Administrator'
FROM @PMMLABOR A

1 个答案:

答案 0 :(得分:0)

这是一个重写版本,它只会在符合你的情况时插入值:

INSERT
INTO dbo.WorkOrderMasterLabor ( WorkOrderMasterID , TaskID , ContractorLaborCraftID , EmployeeLaborCraftID , Sequence , ModifiedTimestamp , ModifiedUserName )
SELECT
        (SELECT WorkOrderMasterID FROM WorkOrderMasters WHERE JobNumber = A.JOBNO),
        NULL,
        NULL,
        (
            SELECT EmployeeLaborCraftID
            FROM dbo.EmployeeLaborCrafts 
            WHERE EmployeeID = (
                SELECT EmployeeID
                FROM Employees
                WHERE EmployeeNumber = A.EMPLOYEENO
            )
            AND LaborCraftID = (
                SELECT LaborCraftID
                FROM LaborCrafts
                WHERE LaborCraftCode = A.LABORCODE
            )
        ),
        '',
        GETDATE(),
        N'Administrator'
FROM @PMMLABOR A
where   EXISTS(
                SELECT 1
                FROM dbo.EmployeeLaborCrafts 
                WHERE EmployeeID = (
                    SELECT EmployeeID
                    FROM Employees
                    WHERE EmployeeNumber = A.EMPLOYEENO
                )
                AND LaborCraftID = (
                    SELECT LaborCraftID
                    FROM LaborCrafts
                    WHERE LaborCraftCode = A.LABORCODE
                )
            )

您可以运行同一个select语句,执行NOT EXISTS代替查找失败的语句,然后根据该结果引发异常。