Procedure 1创建了一个临时表(#MYTABLE),并调用了Procedure 2。Procedure 2也试图创建#MYTABLE,但是列不同。当Procedure 2尝试向#MYTABLE中插入数据时,会出现报错,报错信息是“无效的列名”。我有两个问题:
1) #MYTABLE在Procedure 2内部创建时,系统应该不是也应该报错吗?我知道编译无法检测到这个问题,但是运行时我希望看到一个错误。
2) 给定它对创建没有任何抱怨,并且实际上,当你在Procedure 2内选择#MYTABLE时,你会看到新的列,那么为什么它会对插入操作报错?
以下是代码。取消注释任何一个插入语句都会出现错误。
(我知道很多方法可以解决这种情况,所以我不需要关于此的回复。我只想了解正在发生什么。)
IF OBJECT_ID(N'dbo.MYPROC1', N'P') IS NOT NULL
DROP PROCEDURE dbo.MYPROC1;
GO
CREATE PROCEDURE dbo.MYPROC1
AS
CREATE TABLE dbo.#MYTABLE ( Name VARCHAR(256) );
SELECT
'DO NOTHING 1' AS TABLENAME;
EXEC dbo.MYPROC2;
GO
IF OBJECT_ID(N'dbo.MYPROC2', N'P') IS NOT NULL
DROP PROCEDURE dbo.MYPROC2;
GO
CREATE PROCEDURE dbo.MYPROC2
AS
SELECT
'INSIDE PROC 2 BEFOREHAND' AS TABLENAME
,*
FROM
dbo.#MYTABLE;
CREATE TABLE dbo.#MYTABLE
(
Name VARCHAR(256)
,LastName VARCHAR(256)
);
--INSERT INTO dbo.#MYTABLE
-- ( Name, LastName )
-- SELECT
-- 'BARACK'
-- ,'OBAMA';
SELECT
'INSIDE PROC 2 AFTERWARDS' AS TABLENAME
,*
FROM
dbo.#MYTABLE;
--INSERT INTO dbo.#MYTABLE
-- ( Name, LastName )
-- SELECT
-- 'BARACK'
-- ,'OBAMA';
SELECT
'DO NOTHING 2' AS TABLENAME;
GO
EXEC MYPROC1;