亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 淺析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的嵌套存儲過程中使用同名的臨時表怪像的相關信息資訊供網民參考!
  • 推薦文章
    黄视频网站免费观看| 99色视频在线| 高清一级片| 亚洲第一页乱| 国产综合91天堂亚洲国产| 亚洲女人国产香蕉久久精品| 一a一级片| 欧美一级视| 毛片成人永久免费视频| 亚洲精品中文字幕久久久久久| 国产一区免费观看| 免费一级生活片| 国产成人精品综合久久久| 香蕉视频一级| 精品久久久久久中文字幕一区| 亚欧乱色一区二区三区| 尤物视频网站在线观看| 免费一级生活片| 国产欧美精品| 国产精品123| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产视频一区在线| 精品在线视频播放| 天堂网中文字幕| 韩国三级香港三级日本三级| 黄色短视频网站| 日韩专区在线播放| 一a一级片| 黄色福利片| 四虎影视久久久| 国产成人啪精品视频免费软件| 青青青草影院 | 精品国产一区二区三区精东影业| 亚洲第一色在线| 欧美国产日韩久久久| 国产一级生活片| 亚飞与亚基在线观看| 二级特黄绝大片免费视频大片| 午夜在线亚洲| 成人影院久久久久久影院| 欧美日本韩国| 欧美另类videosbestsex视频| 久草免费在线观看| 九九热国产视频| 国产网站免费在线观看| 欧美另类videosbestsex视频| 国产伦理精品| 国产国语在线播放视频| 中文字幕97| 国产麻豆精品高清在线播放| 美女免费精品视频在线观看| 精品在线观看国产| 午夜久久网| 韩国三级视频网站| 国产网站在线| 国产精品123| 美女免费精品高清毛片在线视| 欧美日本二区| 日韩av东京社区男人的天堂| 你懂的在线观看视频| 国产精品12| 久草免费在线观看| 中文字幕97| 日本免费乱理伦片在线观看2018| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久久成人亚洲| 美女免费黄网站| 国产不卡在线看| a级精品九九九大片免费看| 国产成人欧美一区二区三区的| 国产一区二区精品| 日韩一级黄色片| 精品国产一区二区三区国产馆| 麻豆系列 在线视频| 久久精品店| 国产亚洲精品成人a在线| 99热精品在线| 国产91精品系列在线观看| 99久久精品国产麻豆| 韩国毛片基地| 麻豆系列国产剧在线观看| 色综合久久天天综合| 欧美国产日韩在线| 成人免费高清视频| 你懂的在线观看视频| 国产一区二区精品在线观看| 亚洲天堂免费| 午夜久久网| 99久久精品国产高清一区二区 | 韩国三级香港三级日本三级la| 亚洲 男人 天堂| 日韩专区亚洲综合久久| 成人免费一级毛片在线播放视频| 精品国产三级a| a级黄色毛片免费播放视频| 中文字幕97| 国产麻豆精品hdvideoss| 日韩avdvd| 99色精品| 国产亚洲精品成人a在线| 欧美大片aaaa一级毛片| 国产成人精品综合在线| 久久精品大片| 久久福利影视| 亚洲女人国产香蕉久久精品| 久久国产精品自由自在| 国产伦精品一区三区视频| 国产成人精品在线| 久久国产一区二区| 你懂的福利视频| 黄色短视频网站| 国产一级生活片| 久久国产精品自线拍免费| 日日夜人人澡人人澡人人看免| 日韩专区第一页| 美女免费黄网站| 国产麻豆精品高清在线播放| 你懂的福利视频| 成人高清护士在线播放| 成人a级高清视频在线观看| 韩国毛片基地| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美一级视| 四虎精品在线观看| 欧美大片aaaa一级毛片| 欧美a级片视频| 日韩中文字幕在线观看视频| 国产a网| 国产激情一区二区三区| 韩国妈妈的朋友在线播放| 高清一级做a爱过程不卡视频| 青青青草影院 | 成人免费网站视频ww| 韩国三级一区| 久久国产影视免费精品| 免费国产在线观看| 青草国产在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产成人欧美一区二区三区的| 亚洲 国产精品 日韩| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产一区二区精品久久91| 日日日夜夜操| 午夜欧美成人久久久久久| 99热热久久| 高清一级毛片一本到免费观看| 精品毛片视频| 欧美激情一区二区三区视频 | 国产伦精品一区二区三区在线观看| 国产高清视频免费观看| 欧美日本免费| 色综合久久天天综合观看| 精品视频在线看| 香蕉视频久久| 国产一区二区精品在线观看| 久久国产精品自由自在| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 999久久狠狠免费精品| 国产亚洲男人的天堂在线观看| 国产一级生活片| 精品国产亚一区二区三区| 日韩免费片| 91麻豆高清国产在线播放| 日本伦理片网站| 91麻豆精品国产自产在线| 久久99欧美| 国产高清在线精品一区二区| 欧美一级视| 你懂的日韩| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 中文字幕一区二区三区 精品| 一级女性全黄久久生活片| 国产麻豆精品高清在线播放| 亚洲天堂免费| 亚欧视频在线| 黄色福利| 亚洲精品中文字幕久久久久久| 久久精品大片| 国产韩国精品一区二区三区| 精品视频在线观看一区二区| 四虎影视库国产精品一区| 久草免费在线视频| 中文字幕Aⅴ资源网| 久久99中文字幕| 可以免费看污视频的网站| 免费国产在线观看不卡| 成人免费观看的视频黄页| 亚州视频一区二区| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 亚洲第一色在线| 亚洲第一色在线| 精品久久久久久免费影院| 精品国产一区二区三区免费| 国产亚洲免费观看| 欧美激情一区二区三区在线| 九九久久99综合一区二区| 国产a视频| 九九热国产视频| 日韩在线观看免费|