本文主要介绍了在SQL Server的嵌套存储过程中使用同名的临时表怪。本文非常详细,对大家的学习或工作都有一定的参考价值。需要的朋友可以参考一下。
SQL Server的嵌套存储过程、外部存储过程和内部存储过程(嵌套称为存储过程)中是否可以存在同名的本地临时表?如果可能,有什么问题或者限制吗?在嵌套存储过程中,是调用外部存储过程的临时表还是自己定义的临时表?局部临时表是否有“作用域”,就像高级语言中的变量一样?
注意:它也可以被称为父存储过程和子存储过程,外部存储过程和内部存储过程。这些只是不同的名字或术语。我们在这里统一使用外部存储过程和内部存储过程。后续文章就不描述了。
我们先来看一个例子,如下图,我们构造一个简单的例子。
如果存在(从系统对象中选择1,其中对象标识=对象标识(N'dbo.PRC_TEST ')和对象属性(对象标识,' IsProcedure')=1)
开始
DROP PROCESSion dbo。PRC_TEST
结束
去
CREATE PROC dbo。PRC_TEST
如同
开始
CREATE TABLE # tmp _ test(id INT);
插入#tmp_test
选择1;
SELECT * FROM # tmp _ test
执行PRC_SUB_TEST
选择*从# tmp _测试
结束
去
IF EXISTS(从系统对象中选择1,其中OBJECT _ ID=OBJECT _ ID(N ' dbo . PRC _ SUB _ TEST ')和OBJECTPROPERTY(object_id,' IsProcedure')=1)
开始
DROP PROCESSion dbo。PRC _ SUB _ TEST
结束
去
CREATE PROCEDURE dbo。PRC_SUB_TEST
如同
开始
CREATE TABLE #tmp_test(名称VARCHAR(128));
插入#tmp_test
从系统对象中选择名称
SELECT * FROM # tmp _ test
结束
去
EXEC PRC _ TEST
简单的测试看起来很正常,没有发现问题。如果这个时候下结论,太早了!例如,你看到一只天鹅是白色的。如果你下结论:“天鹅都是白的”,其实世界上有黑天鹅,只是你没见过而已!如下所示,我们修改了存储过程dbo。PRC_SUB_TEST并用字段名替换*,如下所示:
IF EXISTS(从系统对象中选择1,其中OBJECT _ ID=OBJECT _ ID(N ' dbo . PRC _ SUB _ TEST ')和OBJECTPROPERTY(object_id,' IsProcedure')=1)
开始
DROP PROCESSion dbo。PRC _ SUB _ TEST
结束
去
CREATE PROCEDURE dbo。PRC_SUB_TEST
如同
开始
CREATE TABLE #tmp_test(名称VARCHAR(128));
INSERT INT唐山网站设计O #tmp_test
从系统对象中选择名称