sql - 每次添加值加 1 作为更新
问题描述
在 Advantage 中尝试更新临时表中的值,但每次都加 1。起始值需要比另一个表的最大值大一,并且每次更新新行时,都会添加一个。忽略除顶部的声明游标和@nevid 字符串之外的所有内容。我可以让它填充我的临时表中的 evid 列,但它会为每条记录添加 71,这是正确的下一个数字,但我需要它是 71、72、73 等。我哪里出错了?
DECLARE cur CURSOR;
DECLARE @nevid INTEGER;
DECLARE @startdate string;
DECLARE @starttime string;
DECLARE @expectedenddate string;
DECLARE @expectedendtime string;
DECLARE @enddate string;
DECLARE @endtime string;
@nevid =
(
SELECT (max(evid)+1)
FROM pcplevnt
);
SELECT *
INTO #tmpev
FROM <table>;open cur
AS
SELECT *
FROM #tmpev;
WHILE
FETCH cur do
UPDATE #tmpev
SET evid = cast(@nevid AS sql_char(4));SET @nevid = @nevid + 1;
END WHILE;
close cur;
解决方案
我已经构建了一个 MVCE 来重现和解决您的问题:
DECLARE cur CURSOR;
DECLARE @nevid INTEGER;
TRY DROP TABLE #pcplevnt; CATCH ALL END TRY;
TRY DROP TABLE #tmpev; CATCH ALL END TRY;
CREATE TABLE
#pcplevnt
(
evid INTEGER
);
DELETE FROM #pcplevnt;
INSERT INTO #pcplevnt (evid) SELECT 111 FROM system.iota;
SET @nevid = (
SELECT
max(evid) + 1
FROM #pcplevnt
);
CREATE TABLE
#tmpev
(
id AUTOINC,
evid NVARCHAR(4)
);
INSERT INTO
#tmpev
(
evid
)
SELECT '1' FROM system.iota
UNION SELECT '2' FROM system.iota
UNION SELECT '3' FROM system.iota
;
OPEN cur AS SELECT * FROM #tmpev;
WHILE FETCH cur DO
UPDATE
#tmpev
SET
evid = CAST(@nevid AS SQL_CHAR(4))
WHERE
id = cur.id
;
SET @nevid = @nevid + 1;
END WHILE;
CLOSE cur;
select * from #tmpev;
注意循环内部的WHERE
条件:UPDATE
UPDATE
#tmpev
SET
evid = CAST(@nevid AS SQL_CHAR(4))
WHERE
id = cur.id
;
SET @nevid = @nevid + 1;
我添加了一个主键字段id
,我可以在循环内进行比较,以便一次只更新临时表的一行。
推荐阅读
- snowflake-cloud-data-platform - 我应该如何加载其中包含注释和空格的 XML 文件,然后在根元素上使用 XMLGET,我无法获取子元素
- mysql - 派生表上的 MySQL Group Concat
- ssh - 通过 ssh 部署到 DigitalOcean 时如何在 Travis CI 中输入密码
- google-bigquery - 如何验证大型嵌套表的(未嵌套)行数?
- javascript - 如何测试从外部 API 获取数据的组件?
- ios - Swiftui List Row Cells 在 View 出现后设置填充
- mysql - 如何在 MySQLWorkbench 中执行简单的 SQL 命令
- php - Sonata 管理员根据所选值动态更改输入数据 - 自定义控制器
- php - 使用 .htaccess 的 SEO 友好 url 不加载 css 文件(路径是相对的)
- sql-update - 使用 H2 中 CTE 的结果集进行更新