[英]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無法做到這一點。 我能想到的兩種解決方法:
如果庫支持,則可以創建視圖並在其中插入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.