sql - SQL Server 插入到包含列“时间戳(行版本)”的表中
问题描述
我正在为工业环境中的配方管理创建一个 C# Winforms 应用程序。
我创建了一个包含 130 列的 SQL Server 表。该表包含一个名为CheckData
(of datatype Timestamp
) 的列,我用它来检测对一行所做的更改。
如果我在该表中插入一个新行,一切正常。我使用的代码是:
INSERT INTO tablename (Column1, column2, column3, column4)
VALUES (value1, value2, value3, value4)
我只是为主要列分配值,其他列得到它们的默认值。我没有为时间戳字段分配值,因为它是由系统编写的。
此外,我想将此表中的一行复制到同一个表中(复制数据记录)。
我将源行复制到临时表,删除该临时表中的 ID(主键)和时间戳字段,并尝试将临时表中的唯一行插入表中。这失败了。
这是代码:
SELECT *
INTO #temptable
FROM tablename
WHERE Recipe_No = 8;
ALTER TABLE #temptable DROP COLUMN ID, CHECKDATA;
ALTER TABLE #temptable REBUILD;
UPDATE #temptable
SET Recipe_No = 9, Recipe_Name = 'Test'
WHERE Recipe_No = 8;
INSERT INTO tablename
SELECT * FROM #temptable;
我不明白通过插入新行INSERT INTO xxx (yyy) VALUES (zzz)
和插入新行之间的区别在哪里INSERT INTO xxx SELECT * FROM yyy
。在这两种情况下,我都不会尝试在新行中写入时间戳值。
有人知道我在这里缺少什么吗?
解决方案
我不明白通过 INSERT INTO xxx (yyy) VALUES (zzz) 和 INSERT INTO xxx SELECT * FROM yyy 插入新行之间的区别在哪里。
有了这个,
INSERT INTO xxx SELECT * FROM yyy.
您未能指定从 SELECT 到目标表的列映射。您应该始终使用
INSERT INTO xxx (Column1, Column2, . . .)
SELECT (Column1, Column2, . . .)
FROM yyy
这是您正在尝试的简化示例:
drop table if exists t
create table t(id int, a int)
insert into t(id,a) values (1,1)
select * into #t from t where id = 1
alter table #t drop column id
insert into t select * from #t
它会失败
Msg 213, Level 16, State 1, Line 12
Column name or number of supplied values does not match table definition.
因为临时表甚至没有相同数量的列。即使是这样,您也无法确定列映射是否正确。
推荐阅读
- angular - 无法启动事件 onCreateConfirm 和 onEditConfirm
- wallet - Apple 钱包通行证类型 ID
- sql-server - 根据 where 子句,字符转换为日期失败
- c# - C# 比较两个 XML 文件并替换值
- java - 使用 mockito 测试 if 条件
- python - 如何将字符串拆分为3个字符串并在同一个地方替换
- android - setText() 在屏幕上显示文本“null”,但日志使用自定义数组适配器显示值
- python - REST API 中的 POST - JSON 无法序列化我的数据
- css - 如何使引导轮播控件显示在图像顶部而不是图像旁边?
- c# - 我想在我的列表视图中的位置 0 或第一列 (Asp.net) 中插入数字?