婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像

淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像

熱門標簽:南京電銷外呼系統哪家好 地圖標注如何弄全套標 外呼系統會封嗎 股票配資電銷機器人 實體店地圖標注怎么標 電銷機器人 深圳 武漢AI電銷機器人 在電子版地圖標注要收費嗎 萬利達綜合醫院地圖標注點

SQL Server的嵌套存儲過程,外層存儲過程和內層存儲過程(被嵌套調用的存儲過程)中可以存在相同名稱的本地臨時表嗎?如果可以的話,那么有沒有什么問題或限制呢? 在嵌套存儲過程中,調用的是外層存儲過程的臨時表還是自己定義的臨時表呢? 是否類似高級語言的變量一樣,本地臨時表有沒有“作用域“范圍呢?

注意:也可以稱呼為父存儲過程和子存儲過程,外層存儲過程和內層存儲過程。這些只是不同的稱呼或叫法而已。我們這里統一使用外層存儲過程和內層存儲過程。后續文章部分不再述說。

我們先來看一個例子,如下所示,我們構造一個簡單的例子。

IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.PRC_TEST') AND OBJECTPROPERTY(object_id, 'IsProcedure') =1)
BEGIN
  DROP PROCEDURE dbo.PRC_TEST
END
GO
CREATE PROC dbo.PRC_TEST
AS
BEGIN
 
  CREATE TABLE #tmp_test(id INT);
 
  INSERT INTO #tmp_test
  SELECT 1;
 
  SELECT * FROM #tmp_test;
 
  EXEC PRC_SUB_TEST
 
  SELECT * FROM #tmp_test
  
 
END
GO
 
IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1)
BEGIN
  DROP PROCEDURE dbo.PRC_SUB_TEST;
END
GO
 
CREATE PROCEDURE dbo.PRC_SUB_TEST
AS
BEGIN
  
  CREATE TABLE #tmp_test(name VARCHAR(128));
 
  INSERT INTO #tmp_test
  SELECT name FROM sys.objects
 
  SELECT * FROM #tmp_test;
END
GO
 
EXEC PRC_TEST;

簡單測試似乎正常,并沒有發現什么問題。如果此時你就下一個結論的話,那么就為時過早了! 打個比方,你看見一只天鵝是白色的,如果你下了一個定論:“所有天鵝都是白色的”,其實這個世界真的有黑天鵝,只是你沒有見過而已!如下所示,我們修改一下存儲過程dbo.PRC_SUB_TEST,使用字段名name替換*,如下所示:

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1)
BEGIN
  DROP PROCEDURE dbo.PRC_SUB_TEST;
END
GO
 
CREATE PROCEDURE dbo.PRC_SUB_TEST
AS
BEGIN
  
  CREATE TABLE #tmp_test(name VARCHAR(128));
 
  INSERT INTO #tmp_test
  SELECT name FROM sys.objects
 
  SELECT name FROM #tmp_test;
END
GO

然后重復上面測試,如下所示,此時執行存儲過程dbo.PRC_TEST的話,就會報錯:“Invalid column name 'name'.”

此時只要先我執行一次存儲過程dbo.PRC_SUB_TEST,然后再去執行存儲過程dbo.PRC_TEST就不會報錯了。而且只要執行過一次這個存儲過程,然后在當前會話或其它任何會話執行dbo.PRC_TEST都不會報錯了。是否非常讓人迷惑或不解。

EXEC dbo.PRC_SUB_TEST;
 
EXEC PRC_TEST;

如果你要再次重現這個現象的話,只能通過下面SQL或者刪除/重建存儲過程的方式,才能重現這個現象。似乎有點幽靈現象的感覺。

DBCC FREEPROCCACHE

關于這個現象,官方文檔(詳見參考資料的鏈接地址)有這么一段描述:

A local temporary table created within a stored procedure or trigger can have the same name as a temporary table that was created before the stored procedure or trigger is called. However, if a query references a temporary table and two temporary tables with the same name exist at that time, it is not defined which table the query is resolved against. Nested stored procedures can also create temporary tables with the same name as a temporary table that was created by the stored procedure that called it. However, for modifications to resolve to the table that was created in the nested procedure, the table must have the same structure, with the same column names, as the table created in the calling procedure. This is shown in the following example.

在存儲過程或觸發器中創建的本地臨時表的名稱可以與在調用存儲過程或觸發器之前創建的臨時表名稱相同。 但是,如果查詢引用臨時表,而同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢。 嵌套存儲過程同樣可以創建與調用它的存儲過程所創建的臨時表同名的臨時表。但是,為了對其進行修改以解析為在嵌套過程中創建的表,此表必須與調用過程創建的表具有相同的結構和列名。下面的示例說明了這一點。

CREATE PROCEDURE dbo.Test2
AS
  CREATE TABLE #t(x INT PRIMARY KEY);
  INSERT INTO #t VALUES (2);
  SELECT Test2Col = x FROM #t;
GO
 
CREATE PROCEDURE dbo.Test1
AS
  CREATE TABLE #t(x INT PRIMARY KEY);
  INSERT INTO #t VALUES (1);
  SELECT Test1Col = x FROM #t;
EXEC Test2;
GO
 
CREATE TABLE #t(x INT PRIMARY KEY);
INSERT INTO #t VALUES (99);
GO
 
EXEC Test1;
GO

官方文檔中“同時有兩個同名的臨時表,則不定義針對哪個表解析該查詢”這種闡述感覺還是讓人有點迷糊。這里簡單解釋一下,在存儲過程的嵌套調用中,允許外層過程和內層存儲過程中存在相同名字的本地臨時表,但是在內存過程中,如果要對其進行修改或解析(修改很好理解,例如新增索引,增加字段等這類DDL操作;關于解析,查詢臨時表,SQL中指定字段名,就需要解析resolve),那么此時這個臨時表必須表結構一致,否則就會報錯。官方文檔,就是這么一句話,告訴你不行,但是具體原因沒有說。那么我們不妨做一些推測,在存儲過程的嵌套調用中,是否創建了兩個本地臨時表呢?有沒有可能實際只創建了一個本地臨時表呢?出現本地臨時表重用的情況呢? 那么我們簡單驗證一下,如下所示,這里可以判斷實際上創建了兩個本地臨時表。并沒有出現臨時表重用的情況。

SELECT * 
FROM sys.dm_os_performance_counters
WHERE counter_name LIKE 'Temp Tables Creation Rate%';
 
EXEC PRC_TEST;
 
SELECT * 
FROM sys.dm_os_performance_counters
WHERE counter_name LIKE 'Temp Tables Creation Rate%';

當然你可以用下面SQL來進行驗證,跟上面驗證的結果一致。

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1)
BEGIN
  DROP PROCEDURE dbo.PRC_SUB_TEST;
END
GO
 
 
CREATE PROCEDURE dbo.PRC_SUB_TEST
AS
BEGIN
  
  SELECT * FROM #tmp_test;
 
  SELECT * FROM tempdb.dbo.sysobjects WHERE name LIKE '#tmp_test%'
  CREATE TABLE #tmp_test(name VARCHAR(128));
 
  INSERT INTO #tmp_test
  SELECT name FROM sys.objects
  SELECT * FROM tempdb.dbo.sysobjects WHERE name LIKE '#tmp_test%'
  SELECT * FROM #tmp_test;
END
GO

然后我們來看看臨時表的“作用域”,抱歉我用這么一個概念,官方文檔是沒有這個概念,這個只是我們思考的一個方面,細節方面沒有必要抬杠。如下所示,我們修改一下存儲過程

IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1)
BEGIN
  DROP PROCEDURE dbo.PRC_SUB_TEST;
END
GO
CREATE PROCEDURE dbo.PRC_SUB_TEST
AS
BEGIN
  
  SELECT * FROM #tmp_test;
  CREATE TABLE #tmp_test(name VARCHAR(128));
 
  INSERT INTO #tmp_test
  SELECT name FROM sys.objects
 
  SELECT * FROM #tmp_test;
END
GO

通過實驗驗證,我們發現外層存儲過程的臨時表在內層存儲過程中有效,它的“作用域”是在內層存儲過程的同名臨時表創建之前,這個跟高級語言中的全局變量和局部變量作用域有點類似。

既然創建了兩個本地臨時表,那么為什么修改或解析的時候就會報錯呢? 個人的一個猜測是,優化器解析過后,在執行過程中,解析或修改的時候,數據庫引擎無法判斷或者代碼里面沒有這種邏輯去控制檢索哪一個臨時表。有可能是代碼里面的一個缺陷亦或是某種邏輯原因導致。上述僅僅是個人的一個猜測、推理。如有不足或不對的地方,敬請指正。

參考資料:

https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2012/ms174979(v=sql.110)?redirectedfrom=MSDN

到此這篇關于淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像的文章就介紹到這了,更多相關SQL Server嵌套存儲過程內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • sqlserver2005利用臨時表和@@RowCount提高分頁查詢存儲過程性能示例分享
  • sql server2008調試存儲過程的完整步驟
  • SQLServer2008存儲過程實現數據插入與更新
  • Sql Server 存儲過程調用存儲過程接收輸出參數返回值
  • SQLServer存儲過程創建和修改的實現代碼
  • 獲取SqlServer存儲過程定義的三種方法
  • SqlServer存儲過程實現及拼接sql的注意點

標簽:武威 廣東 泰安 汕頭 濟寧 濟源 臺州 安徽

巨人網絡通訊聲明:本文標題《淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像》,本文關鍵詞  淺析,SQL,Server,的,嵌套,存儲,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像》相關的同類信息!
  • 本頁收集關于淺析SQL Server的嵌套存儲過程中使用同名的臨時表怪像的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品日韩av一区二区| 国产精品护士白丝一区av| 亚洲精品一区二区三区四区高清| 国产精品麻豆视频| 麻豆专区一区二区三区四区五区| 99视频有精品| 欧美videos大乳护士334| 亚洲综合色在线| 成+人+亚洲+综合天堂| 日韩久久久精品| 午夜视频一区二区三区| av在线播放不卡| 国产午夜精品久久| 久久精品国产免费| 在线播放欧美女士性生活| 亚洲视频免费看| 国产suv一区二区三区88区| 欧美电视剧在线观看完整版| 午夜精品久久久久久久久| 99免费精品视频| 亚洲欧洲av在线| 成人一区二区视频| 欧美激情一区二区三区蜜桃视频 | 国内外成人在线| 欧美男女性生活在线直播观看| 中文字幕一区二区日韩精品绯色| 国产高清精品久久久久| 2023国产精品视频| 韩国成人福利片在线播放| 日韩欧美国产高清| 国产一区二区三区在线观看免费 | 成人免费在线视频| 成人免费va视频| 中文字幕亚洲视频| 一本大道av伊人久久综合| 亚洲美女一区二区三区| 色综合中文字幕国产 | 91蜜桃传媒精品久久久一区二区| 欧美国产日韩亚洲一区| 91网站在线播放| 亚洲福利一二三区| 69堂国产成人免费视频| 老色鬼精品视频在线观看播放| 91精品综合久久久久久| 精彩视频一区二区| 国产欧美日韩综合精品一区二区| 成人高清免费观看| 一区二区在线看| 5566中文字幕一区二区电影| 日韩精品一区第一页| 久久久精品国产免大香伊| 粗大黑人巨茎大战欧美成人| 一区二区在线观看免费视频播放| 欧美三级日本三级少妇99| 奇米色777欧美一区二区| 久久久久综合网| 91福利在线播放| 久久99国产乱子伦精品免费| 中文字幕乱码久久午夜不卡| 欧美性生活久久| 激情五月播播久久久精品| 亚洲色图视频网| 日韩免费看的电影| a在线播放不卡| thepron国产精品| 亚洲一区二区三区小说| 国产精华液一区二区三区| 国产亚洲自拍一区| 91免费观看视频| 精品一二三四区| 久久精品网站免费观看| 欧美在线观看你懂的| 国产欧美一区二区精品仙草咪| 风间由美中文字幕在线看视频国产欧美| 免费成人在线视频观看| 丝袜亚洲精品中文字幕一区| 天天综合天天做天天综合| 污片在线观看一区二区| 五月天亚洲婷婷| 热久久免费视频| 美女一区二区视频| 极品少妇xxxx精品少妇| 麻豆成人免费电影| 国产高清精品网站| 国产.欧美.日韩| 91麻豆免费在线观看| 色婷婷综合久久久久中文 | 亚洲大尺度视频在线观看| 午夜精品久久久久| 裸体一区二区三区| 国产原创一区二区| 成人在线视频一区| 在线看国产一区二区| 欧美丰满少妇xxxbbb| 久久免费美女视频| 成人免费一区二区三区在线观看| 一区二区三区四区乱视频| 午夜精品一区二区三区电影天堂 | 国产成人av电影| 91免费看片在线观看| 欧美日韩成人综合天天影院 | 捆绑调教美女网站视频一区| 国产不卡视频在线观看| 日本黄色一区二区| 91麻豆精品国产91久久久久久| 精品国精品国产| 成人免费在线视频| 日韩av电影免费观看高清完整版| 国模无码大尺度一区二区三区| 成人免费电影视频| 欧美区在线观看| 国产精品无码永久免费888| 亚洲大片精品永久免费| 国产精品白丝jk黑袜喷水| 91香蕉视频mp4| 日韩欧美一区二区三区在线| 成人免费在线视频观看| 久久99精品国产91久久来源| 一本到三区不卡视频| 精品久久久久久亚洲综合网| 亚洲欧美福利一区二区| 精品制服美女丁香| 在线看国产一区| 欧美国产一区二区在线观看| 日韩精品成人一区二区在线| 国产盗摄一区二区| 91精品国产乱| 亚洲乱码国产乱码精品精小说| 精品一区二区三区日韩| 欧美艳星brazzers| 国产精品久久夜| 国产在线视频精品一区| 欧美老年两性高潮| 亚洲欧洲精品一区二区三区不卡| 极品美女销魂一区二区三区免费| 欧美情侣在线播放| 亚洲日本在线视频观看| 国产不卡在线视频| 精品国产免费久久| 奇米一区二区三区av| 欧美日韩精品三区| 一区二区三区中文字幕| 97久久精品人人做人人爽50路| 久久久亚洲午夜电影| 日本亚洲天堂网| 欧美日韩国产高清一区二区 | 国产在线精品免费| 欧美一级黄色录像| 香蕉久久夜色精品国产使用方法| 91视频com| 中文字幕一区二区在线观看| 成人性生交大合| 久久久无码精品亚洲日韩按摩| 蜜桃久久精品一区二区| 欧美精选午夜久久久乱码6080| 亚洲综合在线第一页| 色菇凉天天综合网| 一个色妞综合视频在线观看| 91在线视频官网| 亚洲婷婷国产精品电影人久久| 处破女av一区二区| 国产精品毛片大码女人| 99久久国产综合精品色伊| 亚洲欧洲精品一区二区精品久久久| 成人av网站大全| 国产精品久久久久久久久久久免费看 | 日韩欧美在线123| 久久精品国产一区二区三区免费看| 7777精品伊人久久久大香线蕉| 亚洲成人精品一区二区| 666欧美在线视频| 久久99国产精品久久99 | 色综合久久久网| 一区二区三区欧美| 在线成人av影院| 国产在线麻豆精品观看| 日本一区二区视频在线| 99国产欧美另类久久久精品| 一卡二卡欧美日韩| 91精品国产综合久久久蜜臀粉嫩| 蜜臀av一级做a爰片久久| 久久综合精品国产一区二区三区| 东方aⅴ免费观看久久av| 国产精品美女久久福利网站| 91成人在线精品| 久久精品999| 国产精品乱子久久久久| 色天天综合久久久久综合片| 日本怡春院一区二区| 国产欧美视频一区二区三区| 色综合久久久久| 美国十次综合导航| 久久久久97国产精华液好用吗| av成人免费在线| 琪琪久久久久日韩精品| 国产精品视频一区二区三区不卡| 91久久精品网| 精品一区精品二区高清| 亚洲日本va午夜在线影院| 欧美一卡二卡在线观看|