婷婷综合国产,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
    国产一区 二区| 国产欧美日韩在线| 九一九一国产精品| 亚洲人成网站在线| 色94色欧美sute亚洲13| 久久嫩草精品久久久精品一| 美腿丝袜一区二区三区| 久久久久9999亚洲精品| 99久久精品国产一区| 一区二区激情小说| 精品久久久久99| 亚洲夂夂婷婷色拍ww47| 成人一区在线观看| 日韩视频中午一区| 亚洲在线观看免费视频| 色综合视频一区二区三区高清| 国产农村妇女毛片精品久久麻豆 | 东方欧美亚洲色图在线| 欧美日韩在线三级| 亚洲大尺度视频在线观看| 91色|porny| 亚洲国产精品久久不卡毛片| 久久久www免费人成精品| 国产91在线|亚洲| 亚洲成人一二三| 欧美精品一区在线观看| av资源网一区| 三级成人在线视频| 一区二区三区欧美在线观看| 久久欧美一区二区| 亚洲黄网站在线观看| 欧美日韩一本到| 亚洲欧美另类久久久精品2019| 欧美日韩高清一区二区| 国产成人8x视频一区二区| 国产精品久久久久久久久免费樱桃| 国产一区二区三区蝌蚪| 亚洲欧美怡红院| 精品视频在线视频| 国产99精品国产| 美女一区二区三区在线观看| 国产成人免费9x9x人网站视频| 风间由美一区二区三区在线观看 | 在线日韩国产精品| 亚洲精品午夜久久久| 成人深夜福利app| 亚洲国产成人一区二区三区| 国产真实乱偷精品视频免| 久久国产精品99久久人人澡| 日韩福利视频导航| 美腿丝袜一区二区三区| 极品少妇xxxx精品少妇| 99re在线精品| 久久精品夜色噜噜亚洲a∨| 美女爽到高潮91| 久久精品视频免费| av资源站一区| 日韩主播视频在线| 精品理论电影在线| 成人国产在线观看| 三级在线观看一区二区| 久久久久久麻豆| 色婷婷亚洲婷婷| 国产精品18久久久久| 国产精品乱码人人做人人爱| 在线一区二区三区| 在线欧美小视频| 国产在线精品一区二区夜色| 亚洲女与黑人做爰| 国产欧美一区视频| 91精品国产综合久久国产大片| caoporn国产精品| 蜜桃免费网站一区二区三区| 亚洲最大色网站| 亚洲欧美激情视频在线观看一区二区三区 | 欧美放荡的少妇| 色综合久久中文字幕综合网 | 国产在线精品一区二区夜色| 亚洲成av人片一区二区三区| **欧美大码日韩| 日韩一区中文字幕| 亚洲人吸女人奶水| 亚洲乱码国产乱码精品精98午夜| 中文一区一区三区高中清不卡| 国产日产欧美一区二区三区| 精品国精品自拍自在线| 欧美绝品在线观看成人午夜影视| 色综合激情久久| 4hu四虎永久在线影院成人| 国产91在线观看| 99精品热视频| 精品影视av免费| 久草中文综合在线| 成人教育av在线| 一本色道a无线码一区v| 精品视频一区二区三区免费| 91.xcao| 久久久国产精品麻豆| 国产精品不卡在线观看| 亚洲午夜免费视频| 国产一区二区三区四区在线观看 | 久久狠狠亚洲综合| 欧美综合一区二区三区| 欧美色欧美亚洲另类二区| 欧美一区二区三区婷婷月色| 欧美高清在线一区二区| 欧美a级一区二区| av不卡一区二区三区| 日韩一区二区在线观看视频| 日本一区二区三区四区在线视频| 亚洲国产精品一区二区尤物区| 美日韩黄色大片| 在线免费观看成人短视频| 久久综合九色综合欧美亚洲| 日韩影视精彩在线| 在线精品视频一区二区三四| 国产精品麻豆久久久| 国产黄色成人av| 精品蜜桃在线看| 极品少妇一区二区三区精品视频| 欧美妇女性影城| 精品国产伦一区二区三区观看体验 | 国产精品污污网站在线观看 | 久久九九久久九九| 麻豆成人久久精品二区三区小说| 91丨porny丨国产入口| 国产精品久久久久三级| av在线播放一区二区三区| 国产精品久久久久四虎| 93久久精品日日躁夜夜躁欧美| 国产精品嫩草久久久久| www.66久久| 亚洲成人自拍一区| 日韩精品资源二区在线| 国产一区二区三区黄视频| 欧美国产激情二区三区| 在线观看国产91| 经典三级一区二区| 中文字幕一区av| 亚洲精品在线观| 国产成人精品影视| 亚洲另类一区二区| 一区二区三区中文免费| 在线观看精品一区| 视频一区二区不卡| 亚洲成国产人片在线观看| 亚洲香肠在线观看| 中文字幕av资源一区| 91美女精品福利| 国产一区二区三区四区五区美女 | 欧美一级xxx| 色婷婷久久久亚洲一区二区三区 | 成人免费毛片片v| 高清国产一区二区三区| 91视视频在线观看入口直接观看www | 国产精品久久久久久妇女6080| 久久久久国产精品厨房| 久久久久久久久久久久久久久99| 久久嫩草精品久久久久| 亚洲精品一卡二卡| 奇米一区二区三区| 成av人片一区二区| 这里只有精品电影| 国产农村妇女毛片精品久久麻豆 | 久久综合av免费| 夜夜嗨av一区二区三区四季av | 婷婷综合五月天| 成人h版在线观看| 日韩精品在线网站| 亚洲一级在线观看| 国产.欧美.日韩| 日韩一区二区在线播放| 亚洲精品成人悠悠色影视| 国产在线日韩欧美| 日韩欧美中文一区| 亚洲高清久久久| www.色精品| 中文字幕一区在线观看视频| 韩国欧美一区二区| 日韩一级片网站| 免费看黄色91| 日韩一区二区三区四区| 亚洲最大的成人av| 欧美色图12p| 国产二区国产一区在线观看| 欧美日韩综合在线| 亚洲精品国产成人久久av盗摄| 91丨九色丨国产丨porny| 中文字幕一区av| 91国产免费观看| 美女免费视频一区二区| 在线观看www91| 狠狠色综合日日| 久久婷婷综合激情| 韩国女主播一区| 91精品啪在线观看国产60岁| 亚洲精品国久久99热| 成人久久视频在线观看| 国产午夜亚洲精品羞羞网站| 久久电影国产免费久久电影|