求一条插入并返回的SQL语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一条插入并返回的SQL语句相关的知识,希望对你有一定的参考价值。
面试的时候面试官跟我提了这样一个问题,就是插入一条记录了之后将这条记录的ID返回出来,注意,可能同一时间提交了很多条,不可能insert了之后还select ,这样可能不准确。
将 OUTPUT INTO 用于简单 INSERT 语句下例向 ScrapReason 表插入一行,并使用 OUTPUT 子句将语句的结果返回给 @MyTableVartable 变量。由于 ScrapReasonID 列使用 IDENTITY 属性定义,因此未在 INSERT 语句中为该列指定一个值。但请注意,将在列 INSERTED.ScrapReasonID 内的 OUTPUT 子句中返回由数据库引擎为该列生成的值。
--创建测试表
Create table Test
(
ID int identity primary key,
Name nvarchar(100),
datet datetime
)
--返回结果集
Create table #Test
(
ID int primary key,
Name nvarchar(100)
)
--插入数据,并使用OUTPUT 子句返回结果集
insert into Test
OUTPUT INSERTED.ID, INSERTED.Name
INTO #Test
select N'Test1',GETDATE()
union all select N'Test2',GETDATE()+1
union all select N'Test3',GETDATE()+2
union all select N'Test4',GETDATE()+3
--验证返回的数据
SELECT * FROM #Test
--实例2
USE AdventureWorks;
GO
DECLARE @MyTableVar table( ScrapReasonID smallint,
Name varchar(50),
ModifiedDate datetime);
INSERT Production.ScrapReason
OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
INTO @MyTableVar
VALUES (N'Operator error', GETDATE());
--Display the result set of the table variable.
SELECT ScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate
FROM Production.ScrapReason;
GO 参考技术A 以SQL Server2005以上版本为例,SQL2008可直接定义表类型接收,返回可用XML或表结果集
USE tempdb
GO
IF OBJECT_ID('Tempdb..#') IS NOT NULL
DROP TABLE #
CREATE TABLE #(ID INT IDENTITY,NAME nvarchar(100))
GO
DECLARE @T TABLE(ID INT)
INSERT #(Name) OUTPUT INSERTED.ID INTO @T SELECT TOP 10 Name FROM sysobjects
SELECT * FROM @T 参考技术B insert ... returning ...
具体语法请参考帮助:
insert into Dumbbells (firstname, lastname, iq)
select fname, lname, iq from Friends order by iq rows 1
returning id, firstname, iq into :id, :fname, :iq;
Oracle 在函数或存储过程中执行一条插入语句并返回主键ID值
有时,我们需要往一张表插入一条记录,同时返回主键ID值。
假定主键ID的值都是通过对应表的SEQUENCE来获得,然后进行ID赋值
这里有几种情况需要注意:
1)如果建表语句含有主键ID的触发器,通过触发器来实现主键ID的自增,实现方式如下:
INSERT INTO GP_MONTH_BILL ( MONTH, BONUS_VALUE, CUR_WAY, CUR_TIME, STATUS, IS_USE, CREATE_TIME) VALUES ( CUR_MONTH, CUR_BONUS_VALUE, ‘包函数固化‘, SYSDATE, ‘固化中‘, 1, SYSDATE) RETURNING ID INTO CUR_MONTH_BILL_ID; --CUR_MONTH_BILL_ID为变量,接收返回的ID值
关键语法: INSERT INTO TABLE VALUES(,) RETURNING ID INTO VAL
补充:此种情况,触发器的语句可能如下
CREATE OR REPLACE TRIGGER GPS.TR_EM_FILES before insert on "GPS"."EM_FILES" for each row begin select "GPS"."SQ_EM_FILES".nextval into :new."ID" from dual; end; /
或
oralce12c,主键是通过default设置SEQUENCE下一个值
CREATE TABLE C##EM.GP_TARGET_TYPE ( ID NUMBER(19) DEFAULT "C##EM"."ISEQ$$_124895".nextval NOT NULL, --DEFAULT默认值为seq的下个值 NAME NVARCHAR2(50) NOT NULL, REMARK NVARCHAR2(200), CREATE_TIME DATE NOT NULL, CREATE_UID NUMBER(19), DELETE_UID NUMBER(19), DELETE_TIME DATE, IS_DELETE NUMBER(1) NOT NULL, UPDATE_TIME DATE, UPDATE_UID NUMBER(19) )
2)如果主键ID的值由用户自主获得SEQUENCE的值,然后赋值,实现方式可以如下:
SELECT YOUR_SEQ.NEXTVAL INTO MID_ID FROM DUAL; --MID_ID为变量 INSERT INTO TABLE(ID) VALUES(MID_ID);
补充:此种情况,可以有触发器,语句可能如下:
CREATE OR REPLACE TRIGGER C##WL.TR_BULLETIN BEFORE INSERT ON C##WL.WL_BULLETIN FOR EACH ROW WHEN ( NEW.ID IS NULL OR NEW.ID = 0 ) BEGIN SELECT WL_BULLETIN_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL; END; /
当前插入的主键ID为空值或0时,获取对应SEQUENCE 的NEXTVAL值来赋值主键ID
以上是关于求一条插入并返回的SQL语句的主要内容,如果未能解决你的问题,请参考以下文章