簡體   English   中英

使用SQL Server中的標識列為INSERT語句指定“ NEXT VALUE”

[英]Specify “NEXT VALUE” for INSERT statement using identity column in SQL Server

考慮下表和Microsoft的INSERT文檔中涉及IDENTITY列的SQL:

CREATE TABLE dbo.T1 (column_1 int IDENTITY, column_2 VARCHAR(30));
GO

INSERT T1 (column_2) VALUES ('Row #2');

INSERT語句未將column_1指定為表的列,並且SQL Server自動為該標識列填充下一個值。 這是標識列的正常處理方式。

在指定列名的同時,如何具有相同的行為?

例如,我正在尋找類似的東西

INSERT INTO T1 (column_1, column_2) 
VALUES (NEXT VALUE, 'Row #3');
GO

我不相信NEXT VALUE在這里NEXT VALUE ,但是有什么有用的嗎? 是否有密鑰令牌或功能將指示應使用標識列?

注意:我問的原因是我正在使用的框架要求在列列表中指定所有列。

如果您使用的是SQL Server 2012及更高版本,則可以使用序列。 但是您必須首先從Column1刪除IDENTITY屬性。 這只能通過復制並重命名新表來完成。

CREATE SEQUENCE Column1_Sequence
    AS int
    START WITH 0;

CREATE TABLE T1
(
    Column1     int DEFAULT (NEXT VALUE FOR Column1_Sequence) PRIMARY KEY
,   Column2     nvarchar(30)
)

之后,您可以通過兩種方式將數據插入表中:

INSERT INTO T1 (Column1, Column2)
    SELECT      NEXT VALUE FOR Column1_Sequence
            ,   'Row #2'

INSERT INTO T1 (Column2)
    SELECT      'Hello world'

您能否在插入之前先打開身份插入,然后再將身份插入關閉

除非您為此表設置了identity_insert(一次為一個),否則您無法為標識列設置值。 一些例子:

create table #tmp (id int identity(1,1), name varchar(10))

insert #tmp (id,name) values (2,'test')
--error Cannot insert explicit value for identity column in table '#tmp

set identity_insert #tmp on --for one table in DB
insert #tmp (id,name) values (2,'qwas')
select * from #tmp
set identity_insert #tmp off -- good practice
--works

--see current identity value
SELECT IDENT_CURRENT ('#tmp') AS Current_Identity;

--Reset identity value
DBCC CHECKIDENT (#tmp, RESEED, 999)
--next insert will be 1000

當然,如果將下一個身份重置為與PK(身份的常規用法)相沖突的值,則將出現Violation of PRIMARY KEY constraint錯誤的情況

我敢肯定,SQL Server無法做到這一點。 我能想到的兩種解決方法:

  1. 如果可能,修復庫。
  2. 如果庫支持,則可以創建視圖並在其中插入INSERT。 例如:

     CREATE TABLE MyTable ( ID INT IDENTITY(1, 1), SomeColumn VARCHAR(100) ) GO CREATE VIEW MyTableView AS SELECT SomeColumn FROM MyTable GO INSERT INTO MyTableView (SomeColumn) VALUES ('Test') 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM