没有指定列的SQL Server插入

时间:2018-05-08 04:52:59

标签: sql sql-server tsql 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]

我想插入此表并提取生成的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并插入它,但同样,我并不是真的想要。

2 个答案:

答案 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