sql - 在 SQL Server 中使用标识列为 INSERT 语句指定 "NEXT VALUE"

标签 sql sql-server sql-insert

考虑下表和来自 Microsoft's INSERT documentation 的 SQL处理 IDENTITY 列:

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 在这里起作用,但是有什么东西可以起作用吗?是否有指示应使用标识列的 key token 或函数?

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

最佳答案

如果您使用的是 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'

关于sql - 在 SQL Server 中使用标识列为 INSERT 语句指定 "NEXT VALUE",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368648/

相关文章:

c# - 在SQL Server中合并一列中的每两行数据

SQL Server,将两条记录合并到一条记录中

php - 比较两个表如果重复列则更新,如果不匹配则插入

mysql - 如何在SQL中选择仅一个字段和所有其他字段重复的记录?

SQL - 带子查询的 DATEDIFF

mysql - 获取具有特定 revision_status 的行

python - pyodbc:如何在 SQL 数据库中存储中文字符?

java - setMaxResult 无法在带有 Hibernate 的 MSSQL Server 2014 中工作

php - 如何循环执行 INSERT INTO 语句

sql - Netezza “[08S01] Communication link failure” 加载外部数据