我正在尝试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。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
答案 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
作为日期的字符串表示格式使其明确无误。