繁体   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