SQL Server插入表中包含一列“时间戳记Rowversion”

问题描述

我正在为工业环境中的配方管理创建一个C#Winforms应用程序。

我创建了一个包含130列的sql Server表。该表包含一列名为CheckData(数据类型为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)值(zzz)和INSERT INTO xxx SELECT * FROM yyy插入新行之间的区别。

有了这个,

INSERT INTO xxx SELECT * FROM yyy.

您没有指定从SELECT到目标表的列映射。您应该始终使用

INSERT INTO xxx (Column1,Column2,. . .)
SELECT (Column1,. . .)
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.

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

,

失败,因为本质上是您的命令

INSERT INTO tablename SELECT * FROM #temptable;";

告诉SQL-“将所有内容从此临时表插入此表中。”

尽管您可以解决此问题,但我想说为什么不尝试只插入要包含的值的当前表中可用的列。无需删除列/值,只需导入即可。

另一种选择-如果您可以写入一个辅助表,那么INSERT INTO相对于临时表而言,拥有该值可能是有益的。然后转换该帮助程序表,然后您可以执行INSERT INTO final_table SELECT * FROM helper。这样应该可以为您提供所需的结果。

我希望这会有所帮助,并希望它能解释您当前命令失败的原因。