SQL Server 插入没有指定列

Aar*_*and 4 sql t-sql sql-server sql-insert

我有一个带有自动生成的 ID 列的表(仅此而已!)

CREATE TABLE [dbo].[EmailGroup](
    [EmailGroupGuid] [uniqueidentifier] NOT NULL 
    CONSTRAINT [PK_EmailGroup] PRIMARY KEY CLUSTERED ([EmailGroupGuid] ASC)
) ON [PRIMARY]


ALTER TABLE [dbo].[EmailGroup] 
    ADD  CONSTRAINT [DF_EmailGroup_EmailGroupGuid]  DEFAULT (newsequentialid()) FOR [EmailGroupGuid]
Run Code Online (Sandbox Code Playgroud)

我想插入到这个表中并提取生成的 ID。但是,我不知道是否可能。它似乎在抱怨缺少值/列。

DECLARE @Id TABLE (Id UNIQUEIDENTIFIER)

INSERT INTO EmailGroup
OUTPUT inserted.EmailGroupID INTO @Id
Run Code Online (Sandbox Code Playgroud)

有什么办法可以做到这一点吗?我的意思是我可以在表中添加一个虚拟列并轻松执行此操作:

INSERT INTO EmailGroup (Dummy)
OUTPUT inserted.EmailGroupID INTO @Id
VALUES (1)
Run Code Online (Sandbox Code Playgroud)

但我真的不想。
我也可以指定我自己的 ID 并插入它,但我又不想这样做。

Zoh*_*led 5

虽然我不确定您为什么需要这样一个表,但您问题的答案是使用关键字DEFAULT

INSERT INTO EmailGroup (EmailGroupGuid)
OUTPUT inserted.EmailGroupGuid INTO @Id
VALUES(DEFAULT);
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用DEFAULT VALUES,如 Pawan Kumar 的答案所示。

这两个选项之间的主要区别在于,指定列列表并使用关键字default可以为您提供更多控制。
当表只有一列时,这似乎没什么大不了的,但是如果您要向表中添加列,并且想要向其中插入特定值,则 usingdefault values将不再是有效的选项。

来自 Microsoft 文档INSERT(Transact-SQL)

默认

强制数据库引擎加载为列定义的默认值。
如果该列不存在默认值并且该列允许空值,则插入 NULL。对于使用时间戳
数据类型 定义的列,将插入下一个时间戳值。 DEFAULT 对于标识列无效。

默认值

强制新行包含为每列定义的默认值。

正如您所看到的,default是基于列的,而default values基于行的。