我有一张带有自动生成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]
我想插入此表并提取生成的ID。但是,如果可能,我无法解决问题。它似乎抱怨缺乏值/列。
DECLARE @Id TABLE (Id UNIQUEIDENTIFIER)
INSERT INTO EmailGroup
OUTPUT inserted.EmailGroupID INTO @Id
有没有办法做到这一点?我的意思是我可以在表格中添加一个虚拟列并轻松执行此操作:
INSERT INTO EmailGroup (Dummy)
OUTPUT inserted.EmailGroupID INTO @Id
VALUES (1)
但是,我并不是真的想要
我也可以指定我自己的ID并插入它,但同样,我并不是真的想要。
答案 0 :(得分:4)
虽然我不确定您为什么需要这样的表格,但您的问题的答案是使用关键字DEFAULT
:
INSERT INTO EmailGroup (EmailGroupGuid)
OUTPUT inserted.EmailGroupGuid INTO @Id
VALUES(DEFAULT);
另一种选择是使用DEFAULT VALUES
,如Pawan Kumar的回答所示。
这两个选项的主要区别在于指定列列表并使用关键字default
可以提供更多控制权。
当表有一个列时,它看起来并不多,但是如果要向表中添加列,并希望向它们插入特定值,则使用default values
将不再是有效选项。 / p>
来自INSERT
(Transact-SQL)上的Microsoft文档:
DEFAULT
强制数据库引擎加载为列定义的默认值 如果列的默认值不存在且列允许空值,则插入NULL 对于使用 timestamp 数据类型定义的列,将插入下一个时间戳值 DEFAULT对标识列无效。
默认值
强制新行包含为每列定义的默认值。
您可以看到,default
是基于列的,而default values
是基于行的。
答案 1 :(得分:2)
请使用此。
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]
DECLARE @Id TABLE (Id UNIQUEIDENTIFIER)
INSERT INTO EmailGroup
OUTPUT inserted.EmailGroupGuid INTO @Id DEFAULT VALUES
SELECT * FROM @Id
我笔记本电脑的最后3个输出
--92832040-7D52-E811-B049-68F728AE8695
--2B6ADC5F-7D52-E811-B049-68F728AE8695
--0140AF66-7D52-E811-B049-68F728AE8695