Подтвердить что ты не робот

SQL Server: невозможно вставить явное значение в столбец временной метки

При использовании этого утверждения

create table demo (
    ts timestamp
)

insert into demo select current_timestamp

Я получаю следующую ошибку:

Невозможно вставить явное значение в столбец временной метки. Используйте INSERT со списком столбцов, чтобы исключить столбец временной метки или вставить DEFAULT в столбец временной отметки

Как вставить текущее время в столбец timestamp?

4b9b3361

Ответ 1

Согласно MSDN, timestamp

Является типом данных, который предоставляет автоматически сгенерированные уникальные двоичные файлы номеров в базе данных. временная метка обычно используется в качестве механизма для строк таблицы тиснения строк. Размер хранилища составляет 8 байтов. Тип данных временной отметки - это просто увеличивающееся число и не сохранить дату или время. Чтобы записать дату или время, используйте дату и время тип данных.

Вместо этого вы, скорее всего, ищете тип данных datetime.

Ответ 2

Если вам нужно скопировать точные данные временной метки, измените тип данных в таблице назначения с отметки времени на двоичный (8) - я использовал varbinary (8), и он работал нормально.

Это, очевидно, нарушает любые функции временной метки в таблице назначения, поэтому убедитесь, что вы в порядке с этим.

Ответ 3

Вы не можете вставлять значения в столбцы timestamp явно. Он автоматически генерируется. Не используйте этот столбец в инструкции insert. Подробнее см. http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx.

Вы можете использовать datetime вместо метки времени, например:

create table demo (
    ts datetime
)

insert into demo select current_timestamp

select ts from demo

Возврат:

2014-04-04 09:20:01.153

Ответ 4

Как вставить текущее время в метку времени с SQL Server:

Ответ: Вы не можете, и вот почему.

В новых версиях SQL Server timestamp переименовывается в RowVersion. Правильно, потому что timestamp очень вводит в заблуждение.

Временная метка SQL Server НЕ установлена ​​пользователем и не представляет дату или время. timestamp - это просто двоичное представление последовательного числа, это полезно только для того, чтобы убедиться, что строка не изменилась с момента ее чтения.

Если вы хотите сохранить дату или время, не используйте временную метку, вы должны использовать один из других типов данных, например, datetime, smalldatetime, date, time или DATETIME2

Например:

create table wtf (
    id INT,
    leet timestamp
)

insert into wtf (id) values (15)

select * from wtf

15    0x00000000000007D3 

Таким образом, timestamp - это своего рода двоичное число. Что делать, если мы попытаемся выполнить его в datetime?

select CAST(leet AS datetime) from wtf

1900-01-01 00:00:06.677

Текущий год для меня - не 1900. Поэтому я не уверен, что думает SQL Server.

Ответ 5

Предположим, что в таблице 1 и таблице 2 есть три столбца A, B и TimeStamp. Я хочу вставить из таблицы 1 в таблицу 2.

Это не выполняется с ошибкой отметки времени:

Insert Into Table2
Select Table1.A, Table1.B, Table1.TimeStamp From Table1

Это работает:

Insert Into Table2
Select Table1.A, Table1.B, null From Table1

Ответ 6

В этих ответах есть хорошая информация. Предположим, вы имеете дело с базами данных, которые вы не можете изменить, и копируете данные из одной версии таблицы в другую или из той же таблицы в одной базе данных в другую. Предположим также, что существует много столбцов, и вам либо нужны данные из всех столбцов, либо столбцы, которые вам не нужны, не имеют значений по умолчанию. Вам нужно написать запрос со всеми именами столбцов.

Вот запрос, который возвращает все имена столбцов без отметки времени для таблицы, которую вы можете вырезать и вставить в свой запрос вставки. К вашему сведению: 189 - это идентификатор типа для отметки времени.

declare @TableName nvarchar(50) = 'Product';

select stuff(
    (select 
        ', ' + columns.name
    from 
        (select id from sysobjects where xtype = 'U' and name = @TableName) tables
        inner join syscolumns columns on tables.id = columns.id
    where columns.xtype <> 189
    for xml path('')), 1, 2, '')

Просто измените название таблицы вверху с "Продукт" на имя вашей таблицы. Запрос вернет список имен столбцов:

ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate

Если вы копируете данные из одной базы данных (DB1) в другую базу данных (DB2), вы можете использовать этот запрос.

insert DB2.dbo.Product (ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate)
select ProductID, Name, ProductNumber, MakeFlag, FinishedGoodsFlag, Color, SafetyStockLevel, ReorderPoint, StandardCost, ListPrice, Size, SizeUnitMeasureCode, WeightUnitMeasureCode, Weight, DaysToManufacture, ProductLine, Class, Style, ProductSubcategoryID, ProductModelID, SellStartDate, SellEndDate, DiscontinuedDate, rowguid, ModifiedDate 
from DB1.dbo.Product

Ответ 7

создать демонстрацию таблицы (   id int,   ts timestamp )

Вставить в демо (id, ts)  значения (1, ПО УМОЛЧАНИЮ)