首页 > 解决方案 > 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。在这两种情况下,我都不会尝试在新行中写入时间戳值。

有人知道我在这里缺少什么吗?

标签: sqlsql-serverinserttimestamp

解决方案


我不明白通过 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.

因为临时表甚至没有相同数量的列。即使是这样,您也无法确定列映射是否正确。


推荐阅读