我有以下 2 条
INSERT
陈述:
-- Create a new database entry for the astronomicalObject in the GradObservers database
-- based on values of the given id
INSERT INTO astro.bodies (id, title, coordinates)
SELECT NEXT VALUE FOR bodies.nextid, title, 9291
FROM astro.astro
WHERE id = 002811
-- Insert new id from table above into astro.sources
-- Insert other fields from existing bodyId 002811
INSERT INTO astro.sources(bodyId, baseValue, Url)
(SELECT CONVERT(BIGINT, current_value) FROM sys.sequences WHERE schema_id = 71)
SELECT baseValue, Url
FROM astro.sources
WHERE bodyId = 002811
我正在尝试执行 2 个
INSERT
命令,其中第二个命令取决于第一个命令的 ID
值。
第一个
INSERT
使用数据库中的SEQUENCE
来获取它的ID
。
那么第二个
INSERT
也需要使用该ID。
第一个
INSERT
有效,但我从第二个语句中收到错误:
INSERT 语句的选择列表包含的项目少于插入列表。 SELECT 值的数量必须与 INSERT 列的数量匹配。
有办法让这个工作吗?
谢谢!
您插入了一个值,后跟一个单独的
SELECT
语句。
正确的语法应该是在主
SELECT
中嵌套 SELECT
。为了安全起见,您可能应该使用序列名称。
INSERT INTO astro.sources
(bodyId, baseValue, Url)
SELECT
(
SELECT CONVERT(BIGINT, seq.current_value)
FROM sys.sequences seq
JOIN sys.schemas sch ON sch.schema_id = seq.schema_id
WHERE sch.name = 'bodies'
AND seq.name = 'nextid'
)
baseValue,
Url
FROM astro.sources
WHERE bodyId = 002811;
但是,您可能最好首先将其存储在变量中。
DECLARE @id bigint = NEXT VALUE FOR bodies.nextid;
INSERT INTO astro.bodies
(id, title, coordinates)
SELECT
@id,
title,
9291
FROM astro.astro
WHERE id = 2811;
INSERT INTO astro.sources
(bodyId, baseValue, Url)
SELECT
@id,
baseValue,
Url
FROM astro.sources
WHERE bodyId = 2811;
旁注:
bodyId = 002811
没有多大意义。 002811
是一个数字而不是字符串,那么为什么它有前导零。