INSERT SELECT SQL Query with Variables

时间:2017-04-19 14:33:29

标签: sql-server

我正在尝试INSERT记录,其中记录中的某些字段来自一个表,其余字段是根据变量创建的。这是我尝试创建记录的INSERT SELECT查询:

    DECLARE @projid INT
    ,@status INT
    ,@created DATETIME
    ,@duedate DATETIME
    ,@numdays INT
    ,@divid INT

    SET     @divid = 
        (SELECT DIVID
        FROM DIV
        WHERE StepOrder=1)
    SET     @numdays =
        (SELECT CompTarget
        FROM DIV
        WHERE DIVID=@divid)
    SET     @projid = 10
    SET     @status = 0
    SET     @duedate = 
        DATEADD(day,@numdays,@created)
    SET     @created = '4/18/2017'

    INSERT INTO DIVTasks (ProjectID, GroupID, Status, Created, DueDate, DIVID)

    SELECT @projid, GroupID, @status, @created, @duedate, DIVID
    FROM DIV
    WHERE StepOrder=1

StepOrder有3条记录等于1,它们有不同的“CompTarget”数字。

我需要做的是在“创建”日期添加“CompTarget”号并为每条记录返回“DueDate”。

上述查询返回此错误,但输入3条记录,其中“DueDate”为Null:

  

Msg 512,Level 16,State 1,Line 8   子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

1 个答案:

答案 0 :(得分:0)

两者

SET     @divid = 
    (SELECT DIVID
    FROM DIV
    WHERE StepOrder=1)

SET     @numdays =
    (SELECT CompTarget
    FROM DIV
    WHERE DIVID=@divid)

会导致同样的错误,因为你写的那个表中有3条StepOrder等于1的记录。

然而,我认为你过于复杂化了 请尝试使用此insert....select

DECLARE @projid INT = 10
       ,@status INT = 0
       ,@created DATETIME = '2017-04-18' -- note the change of format here!
INSERT INTO DIVTasks (ProjectID, GroupID, Status, Created, DueDate, DIVID)

SELECT @projid, GroupID, @status, @created, DATEADD(day,CompTarget,@created), DIVID
FROM DIV
WHERE StepOrder=1

注意 - 使用yyyy-mm-dd作为日期的字符串表示格式使其明确无误。