如何解决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
。这样应该可以为您提供所需的结果。
我希望这会有所帮助,并希望它能解释您当前命令失败的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。