我的具有 2 个 INSERT 命令的 SQL 语句在第二个 INSERT 上失败

问题描述 投票:0回答:1

我有以下 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 列的数量匹配。

有办法让这个工作吗?

谢谢!

sql sql-server tsql sql-server-2008
1个回答
1
投票

您插入了一个值,后跟一个单独的

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
是一个数字而不是字符串,那么为什么它有前导零。

© www.soinside.com 2019 - 2024. All rights reserved.