복붙노트

[SQL] SQL 서버 : 타임 스탬프 열에 명시 적 값을 삽입 할 수 없습니다

SQL

SQL 서버 : 타임 스탬프 열에 명시 적 값을 삽입 할 수 없습니다

이 문을 사용하는 경우

create table demo (
    ts timestamp
)

insert into demo select current_timestamp

나는 다음과 같은 오류가 발생합니다 :

어떻게 타임 스탬프 열을 현재 시간을 삽입합니까?

해결법

  1. ==============================

    1.MSDN에 따르면, 타임 스탬프

    MSDN에 따르면, 타임 스탬프

    당신은 아마 대신 datetime 데이터 형식을 찾고 있습니다.

  2. ==============================

    2.당신이 동일한 타임 스탬프 데이터를 복사 할 필요가있는 경우, 바이너리 (8)에 타임 스탬프에서 대상 테이블의 데이터 유형을 변경 - 내가 VARBINARY (8)를 사용하고는 벌금을했다.

    당신이 동일한 타임 스탬프 데이터를 복사 할 필요가있는 경우, 바이너리 (8)에 타임 스탬프에서 대상 테이블의 데이터 유형을 변경 - 내가 VARBINARY (8)를 사용하고는 벌금을했다.

    이것은 분명히 그렇게 첫 번째로 반드시있는 거 확인을하기 위해선, 대상 테이블에있는 타임 스탬프 기능을 나누기.

  3. ==============================

    3.명시 적으로 타임 스탬프 열에 값을 삽입 할 수 없습니다. 그것은 자동으로 생성합니다. 당신의 삽입 성명에서이 열을 사용하지 마십시오. 자세한 내용은 http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx를 참조하십시오.

    명시 적으로 타임 스탬프 열에 값을 삽입 할 수 없습니다. 그것은 자동으로 생성합니다. 당신의 삽입 성명에서이 열을 사용하지 마십시오. 자세한 내용은 http://msdn.microsoft.com/en-us/library/ms182776(SQL.90).aspx를 참조하십시오.

    대신이 같은 소인의 날짜를 사용할 수 있습니다 :

    create table demo (
        ts datetime
    )
    
    insert into demo select current_timestamp
    
    select ts from demo
    

    보고:

    2014-04-04 09:20:01.153
    
  4. ==============================

    4.그 이유는 여기에 당신은 할 수없고 : 답변.

    그 이유는 여기에 당신은 할 수없고 : 답변.

    SQL 서버의 최신 버전으로, 타임 스탬프는 RowVersion로 이름이 변경됩니다. 타임 스탬프이기 때문에 바르게 그래서, 매우 오해의 소지가.

    SQL 서버 타임 스탬프는 사용자가 설정되어 있지 않고 날짜 또는 시간을 나타내지 않습니다. 타임 스탬프는 그것이 읽은 이후 변경되지 않았는지 확인 행을 만들기위한 유일한 좋은, 연속 번호 단지 바이너리 표현입니다.

    당신이 타임 스탬프를 사용하지 않는, 날짜 또는 시간을 저장하려면, 당신은 예를 들어, 날짜, smalldatetime으로, 날짜, 시간 또는 DATETIME2에 대한 같은 다른 데이터 유형 중 하나를 사용합니다

    예를 들면 :

    create table wtf (
        id INT,
        leet timestamp
    )
    
    insert into wtf (id) values (15)
    
    select * from wtf
    
    15    0x00000000000007D3 
    

    타임 스탬프 그래서 진수의 일종이다. 우리는 날짜에 무엇을 캐스팅하려고하면?

    select CAST(leet AS datetime) from wtf
    
    1900-01-01 00:00:06.677
    

    나는 확실히 SQL Server가 생각하고 무엇을하지 않아요 그래서 나를 위해 올해는 없습니다 1900입니다.

  5. ==============================

    5.표 1과 표 2는 세 개의 열 A, B와 타임 스탬프를 가정합니다. 나는 표 2에 표 1에서 삽입 할.

    표 1과 표 2는 세 개의 열 A, B와 타임 스탬프를 가정합니다. 나는 표 2에 표 1에서 삽입 할.

    이 타임 스탬프 오류와 함께 실패합니다 :

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

    이 작품 :

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

    6.이 답변에 좋은 정보가있다. 당신은 변경할 수 없습니다 데이터베이스를 다루고, 당신은 다른 테이블의 한 버전에서 데이터를 복사하는 것을, 또는 다른 하나의 데이터베이스에서 같은 테이블에서 가정하자. 당신이 모든 열에서 하나 필요 데이터, 또는 디폴트 값이없는 필요하지 않은 열이 열을 많이, 그리고 것이 가정하자. 당신은 모든 열 이름으로 쿼리를 작성해야합니다.

    이 답변에 좋은 정보가있다. 당신은 변경할 수 없습니다 데이터베이스를 다루고, 당신은 다른 테이블의 한 버전에서 데이터를 복사하는 것을, 또는 다른 하나의 데이터베이스에서 같은 테이블에서 가정하자. 당신이 모든 열에서 하나 필요 데이터, 또는 디폴트 값이없는 필요하지 않은 열이 열을 많이, 그리고 것이 가정하자. 당신은 모든 열 이름으로 쿼리를 작성해야합니다.

    다음은 절단하고 삽입 쿼리에 붙여 넣을 수있는 테이블에 대한 모든 비 - 타임 스탬프 열 이름을 반환하는 쿼리입니다. FYI 189은 타임 스탬프의 형태 ID이다.

    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
    

    다른 데이터베이스 (DB2)에 하나 개의 데이터베이스 (DB1)에서 데이터를 복사하는 경우이 쿼리를 사용할 수 있습니다.

    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. ==============================

    7.(표 데모를 만들     아이디 INT,     TS 타임 스탬프 )

    (표 데모를 만들     아이디 INT,     TS 타임 스탬프 )

    데모에 삽입 (아이디, TS)  값 (1, DEFAULT)

  8. from https://stackoverflow.com/questions/10262426/sql-server-cannot-insert-an-explicit-value-into-a-timestamp-column by cc-by-sa and MIT license