Sql server 在SQL Server(T-SQL)中更改表时,如何保留时间戳值?

Sql server 在SQL Server(T-SQL)中更改表时,如何保留时间戳值?,sql-server,database,sql-server-2008,tsql,timestamp,Sql Server,Database,Sql Server 2008,Tsql,Timestamp,或者:如何将时间戳数据从一个表复制到另一个表 使用SQL Server 2008并具有旧的设计文档,它需要一个表来以一定的方式排序列(用时间戳< /代码>列最后,我猜是从Excel被用来代替SQL数据库的时候),我需要在表中间添加一个列,保持时间戳数据完整 您知道如何指示SQL Server执行此操作吗 示例T-SQL代码: -- In the beginning... CREATE TABLE TestTableA ( [TestTableAId] [int] IDENTITY(1,1

或者:如何将时间戳数据从一个表复制到另一个表

使用SQL Server 2008并具有旧的设计文档,它需要一个表来以一定的方式排序列(用<代码>时间戳< /代码>列最后,我猜是从Excel被用来代替SQL数据库的时候),我需要在表中间添加一个列,保持

时间戳
数据完整

您知道如何指示SQL Server执行此操作吗

示例T-SQL代码:

-- In the beginning...
CREATE TABLE TestTableA
(
    [TestTableAId] [int] IDENTITY(1,1) NOT NULL,
    [TestTableAText] varchar(max) NOT NULL,
    [TestTableATimeStamp] [timestamp] NOT NULL
)

INSERT INTO TestTableA (TestTableAText) VALUES ('TEST')
--许多年过去了

--现在我们需要向这个表中添加一列,但保留所有数据,包括时间戳数据。 --附加要求:我们希望SQLServer保留列的最后一个时间戳

CREATE TABLE TestTableB
(
    [TestTableBId] [int] IDENTITY(1,1) NOT NULL,
    [TestTableBText] varchar(max) NOT NULL,
    [TestTableBInt] [int] NULL,
    [TestTableBTimeStamp] [timestamp] NOT NULL
)

-- How do we copy the timestamp data from TestTableATimestamp to `TestTableBTimestamp`?

SET IDENTITY_INSERT [TestTableB] ON

-- Next line will produce errormessage:
-- Cannot insert an explicit value into a timestamp column. Use INSERT with a column list to exclude the timestamp column, or insert a DEFAULT into the timestamp column.

INSERT INTO [TestTableB] (TestTableBId, TestTableBText, TestTableBTimeStamp) 
    SELECT TestTableAId, TestTableAText, TestTableATimestamp 
    FROM TestTableA

SET IDENTITY_INSERT [TestTableB] OFF

GO

建议?

首先检查要求:这取决于您是否需要保留时间戳。实际上可能不是,因为它们只是
ROWVERSION
值,实际上并不以任何方式对时间进行编码。所以检查一下

您可能不想保留它们的原因:
TIMESTAMP
ROWVERSION
的唯一目的是确定行自上次读取以来是否已更改。如果要添加列,可能希望将其视为更改,特别是在默认值为非null时


如果确实需要保留时间戳,请参阅Dmitry的答案。

首先删除表TestTableB,然后运行查询:

SELECT 
    TestTableAId AS TestTableBId, 
    TestTableAText AS TestTableBText, 
    cast(null as int) as TestTableBInt,
    TestTableATimestamp AS TestTableBTimeStamp
INTO TestTableB
FROM TestTableA

有点相关,但尚未以有助于解决此问题的方式回答…视图可能是可行的解决方案?通过这种方式,您可以在不更改实际表的情况下将字段按任何顺序排列。“timestamp”一词在SQL Server中很难理解,因为它与时间完全无关。如果你的专栏的数据类型是“timestamp”,那么仔细看看Ben的答案。我真的希望“时间戳”没有被用作列标题,那不会太好。请参阅-哦,很抱歉,我错过了将列指定为数据类型时间戳的DDL-很抱歉,您需要指定新列的类型:
cast(null为int)as testablebint
将完成此操作非常感谢!我只是喜欢你在这里能以如此快的速度得到谷歌根本无法回答的答案。