不修改存储过程testalready,如何让@createname获取@already生成值?
问题与解决方案
现有表结构
CREATE TABLE person ( pid INT PRIMARY KEY, pname varchar(50), page int, psalary int, paddress varchar(50) )
现有存储过程
CREATE PROCEDURE testalready @createid int, @createname varchar(50) = NULL, @crage int AS BEGIN DECLARE @already varchar(50) SELECT @already = FLOOR(RAND() * POWER(CAST(10 AS BIGINT), 5)) INSERT INTO person (pid, pname, page, psalary) VALUES (@createid, @createname, @crage, @already) END
需求
执行存储过程testalready时,让参数@createname获取该过程内部生成的@already的值,但绝对不能修改存储过程本身,有没有可行的实现方法?
可行方案:创建INSTEAD OF INSERT触发器
既然不能改存储过程,我们可以在person表上建一个INSTEAD OF INSERT触发器,拦截存储过程的插入操作,把原本要存到psalary的@already值转到pname字段里,就能达到需求效果。
触发器创建代码如下:
CREATE TRIGGER trg_person_replace_pname ON person INSTEAD OF INSERT AS BEGIN INSERT INTO person (pid, pname, page, psalary, paddress) SELECT pid, CAST(psalary AS varchar(50)), -- 把psalary里的@already值赋值给pname page, psalary, paddress FROM inserted; END
逻辑说明
- 这个触发器会在存储过程执行
INSERT时自动触发,直接替换掉原本的插入逻辑 - 从SQL Server的系统临时表
inserted里,拿到存储过程准备插入的所有数据 - 将
psalary字段的值(也就是存储过程内部生成的@already)转成varchar(50)类型后,赋值给pname字段 - 其他字段都保持存储过程原本要插入的值不变,最终
pname里存的就是@already,刚好满足你要让@createname获取该值的需求(因为存储过程原本是把@createname插入到pname,现在通过触发器替换成了@already)
内容的提问来源于stack exchange,提问作者Brijesh Roy
相关产品推荐
相关产品推荐

