精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

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

存儲 存儲軟件
SQL Server的嵌套存儲過程,外層存儲過程和內層存儲過程(被嵌套調用的存儲過程)中可以存在相同名稱的本地臨時表嗎?如果可以的話,那么有沒有什么問題或限制呢?

[[381365]]

本文轉載自微信公眾號「DBA閑思雜想錄」,作者瀟湘隱者 。轉載本文請聯系DBA閑思雜想錄公眾號。  

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

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

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

  1. IF EXISTS (SELECT 1 FROM sys.objects WHERE object_id = OBJECT_ID(N'dbo.PRC_TEST'AND OBJECTPROPERTY(object_id, 'IsProcedure') =1) 
  2. BEGIN 
  3.  DROP PROCEDURE dbo.PRC_TEST 
  4. END 
  5. GO 
  6. CREATE PROC dbo.PRC_TEST 
  7. AS 
  8. BEGIN 
  9.  
  10.  CREATE TABLE #tmp_test(id INT); 
  11.  
  12.  INSERT INTO #tmp_test 
  13.  SELECT 1; 
  14.  
  15.  SELECT * FROM #tmp_test; 
  16.  
  17.  EXEC PRC_SUB_TEST 
  18.  
  19.  SELECT * FROM #tmp_test 
  20.   
  21.  
  22. END 
  23. GO 
  24.  
  25.  
  26.  
  27. IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1) 
  28. BEGIN 
  29.  DROP PROCEDURE dbo.PRC_SUB_TEST; 
  30. END 
  31. GO 
  32.  
  33.  
  34. CREATE PROCEDURE dbo.PRC_SUB_TEST 
  35. AS 
  36. BEGIN 
  37.      
  38.  CREATE TABLE #tmp_test(name VARCHAR(128)); 
  39.  
  40.  INSERT INTO #tmp_test 
  41.  SELECT name FROM sys.objects 
  42.  
  43.  SELECT * FROM #tmp_test; 
  44. END 
  45. GO 
  46.  
  47.  
  48. EXEC PRC_TEST; 

 

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

  1. IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1) 
  2. BEGIN 
  3.  DROP PROCEDURE dbo.PRC_SUB_TEST; 
  4. END 
  5. GO 
  6.  
  7. CREATE PROCEDURE dbo.PRC_SUB_TEST 
  8. AS 
  9. BEGIN 
  10.      
  11.  CREATE TABLE #tmp_test(name VARCHAR(128)); 
  12.  
  13.  INSERT INTO #tmp_test 
  14.  SELECT name FROM sys.objects 
  15.  
  16.  SELECT name FROM #tmp_test; 
  17. END 
  18. GO 

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

 

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

  1. EXEC dbo.PRC_SUB_TEST; 
  2. EXEC PRC_TEST; 

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

  1. 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.

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

  1. CREATE PROCEDURE dbo.Test2 
  2. AS 
  3.     CREATE TABLE #t(x INT PRIMARY KEY); 
  4.     INSERT INTO #t VALUES (2); 
  5.     SELECT Test2Col = x FROM #t; 
  6. GO 
  7.  
  8. CREATE PROCEDURE dbo.Test1 
  9. AS 
  10.     CREATE TABLE #t(x INT PRIMARY KEY); 
  11.     INSERT INTO #t VALUES (1); 
  12.     SELECT Test1Col = x FROM #t; 
  13. EXEC Test2; 
  14. GO 
  15.  
  16. CREATE TABLE #t(x INT PRIMARY KEY); 
  17. INSERT INTO #t VALUES (99); 
  18. GO 
  19.  
  20. EXEC Test1; 
  21. GO 

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

  1. SELECT *  
  2. FROM sys.dm_os_performance_counters 
  3. WHERE counter_name LIKE 'Temp Tables Creation Rate%'
  4.  
  5. EXEC PRC_TEST; 
  6.  
  7. SELECT *  
  8. FROM sys.dm_os_performance_counters 
  9. WHERE counter_name LIKE 'Temp Tables Creation Rate%'

 

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

  1. IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1) 
  2. BEGIN 
  3.  DROP PROCEDURE dbo.PRC_SUB_TEST; 
  4. END 
  5. GO 
  6.  
  7.  
  8. CREATE PROCEDURE dbo.PRC_SUB_TEST 
  9. AS 
  10. BEGIN 
  11.      
  12.  SELECT * FROM #tmp_test; 
  13.  
  14.  SELECT *  FROM tempdb.dbo.sysobjects WHERE name LIKE '#tmp_test%' 
  15.  CREATE TABLE #tmp_test(name VARCHAR(128)); 
  16.  
  17.  INSERT INTO #tmp_test 
  18.  SELECT name FROM sys.objects 
  19.  SELECT *  FROM tempdb.dbo.sysobjects WHERE name LIKE '#tmp_test%' 
  20.  SELECT * FROM #tmp_test; 
  21. END 
  22. GO 

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

  1. IF EXISTS(SELECT 1 FROM sys.objects WHERE object_id= OBJECT_ID(N'dbo.PRC_SUB_TEST' ) AND OBJECTPROPERTY(object_id, 'IsProcedure')=1) 
  2. BEGIN 
  3.  DROP PROCEDURE dbo.PRC_SUB_TEST; 
  4. END 
  5. GO 
  6. CREATE PROCEDURE dbo.PRC_SUB_TEST 
  7. AS 
  8. BEGIN 
  9.      
  10.  SELECT * FROM #tmp_test; 
  11.  CREATE TABLE #tmp_test(name VARCHAR(128)); 
  12.  
  13.  INSERT INTO #tmp_test 
  14.  SELECT name FROM sys.objects 
  15.  
  16.  SELECT * FROM #tmp_test; 
  17. END 
  18. GO 

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

 

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

參考資料:

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

責任編輯:武曉燕 來源: DBA閑思雜想錄
相關推薦

2010-11-12 13:27:13

動態sql

2010-11-12 09:18:13

SQL Server存

2011-08-15 15:56:31

SQL Server

2010-07-22 15:56:04

SQL Server臨

2011-09-01 13:09:58

SQL Server DataTable作為

2010-10-19 14:45:01

SQL SERVER臨

2010-10-09 16:41:54

MYSQL存儲過程

2021-01-18 05:23:14

SQL 排序Server

2010-07-15 12:38:14

SQL Server存

2009-08-04 10:29:06

在C#中使用存儲過程

2009-09-14 16:29:39

LINQ嵌套

2010-07-08 14:42:34

SQL Server臨

2010-10-19 15:25:05

Sql Server臨

2010-09-14 10:16:57

sql server

2011-03-24 13:38:47

SQL Server 存儲分頁

2010-09-16 15:10:48

SQL Server表

2009-07-01 02:29:24

臨時表T-SQL

2010-09-16 16:23:06

sql server批

2011-03-29 13:22:07

SQL Server臨時表表變量

2010-09-16 17:56:31

SQL server臨
點贊
收藏

51CTO技術棧公眾號

亚洲一区二区不卡免费| 美国毛片一区二区三区| 精品国精品国产| 日本一区午夜艳熟免费| 天天干天天插天天操| 另类av一区二区| 综合136福利视频在线| 五月六月丁香婷婷| 蜜桃成人365av| www久久精品| 成人美女av在线直播| 久久久久久久蜜桃| 国产传媒欧美日韩成人精品大片| 欧美性高清videossexo| 国产 国语对白 露脸| 国产乱视频在线观看| 国产黄色91视频| 日本韩国欧美精品大片卡二| 免费国产羞羞网站美图| 色婷婷精品视频| 91精品福利在线一区二区三区| 欧美成人高潮一二区在线看| 秋霞午夜理伦电影在线观看| 不卡的电视剧免费网站有什么| 国产精品高潮在线| 日本三级午夜理伦三级三| 国产精品久久久久久久免费观看| 亚洲黄在线观看| 国产农村妇女精品久久| 一二区成人影院电影网| 亚洲一级二级在线| 伊人精品久久久久7777| 精品三级久久久久久久电影聊斋| 国产精品一级片| 国产精品一区二区三| 韩国av中文字幕| 国产在线成人| 久久色免费在线视频| 熟女俱乐部一区二区| 国偷自产av一区二区三区| 欧美日韩国产高清一区| 色综合av综合无码综合网站| 波多野在线观看| 一区二区三区欧美日韩| 在线国产99| 一本一道波多野毛片中文在线 | 97国产精品视频人人做人人爱| 少妇太紧太爽又黄又硬又爽小说| 亚洲欧洲美洲国产香蕉| 亚洲激情第一页| 少妇精品无码一区二区三区| 欧美不卡在线观看| 7777精品久久久大香线蕉| 亚洲最大成人在线观看| 经典三级一区二区| 91福利国产成人精品照片| 国产精品无码av在线播放| 国模私拍视频在线播放| 一二三四社区欧美黄| 大桥未久一区二区| av免费网站在线观看| 亚洲三级理论片| 亚洲一区二区在线观| 第一福利在线| 中文成人av在线| 这里只有精品66| 免费大片在线观看www| 国产精品国产三级国产普通话蜜臀| 亚洲狠狠婷婷综合久久久| www.成人.com| 亚洲欧洲av在线| 国产又黄又爽免费视频| 超碰在线无需免费| 一个色在线综合| 久草热视频在线观看| 中文字幕资源网在线观看免费| 欧美日韩亚洲一区二区| 国产精彩免费视频| 992tv国产精品成人影院| 欧美精品三级在线观看| 欧美国产日韩在线视频| 猫咪成人在线观看| 亚洲欧洲偷拍精品| 成人性视频免费看| 888久久久| 欧美华人在线视频| 亚洲男人的天堂在线视频| 久久国产直播| 国产日韩在线一区| 亚洲第一色网站| 91污在线观看| 亚洲欧美成人一区| 久久99亚洲网美利坚合众国| 一本到一区二区三区| 爱爱爱爱免费视频| 大型av综合网站| 国产一区二区三区18| 精品一区二区在线观看视频| 国产精品hd| 日本免费在线精品| 国产精品久久综合青草亚洲AV| 成人精品免费视频| 手机看片福利永久国产日韩| 亚洲按摩av| 日本高清视频一区二区| 在线观看中文av| 久操国产精品| 久久99国产精品自在自在app | www.亚洲免费| 亚洲一级片在线观看| 黄色国产小视频| 在线精品自拍| 最近2019年日本中文免费字幕| 欧美成人一二三区| 日本视频一区二区三区| 国产精品日韩高清| 女女色综合影院| 懂色av中文一区二区三区天美| 一起操在线视频| 久久最新网址| 午夜精品福利视频| 97免费观看视频| 国产亚洲欧美日韩俺去了| 8x8x华人在线| 96视频在线观看欧美| 亚洲欧美日韩国产中文专区| 久久午夜无码鲁丝片| 蜜臂av日日欢夜夜爽一区| 精品国产一区二区三区麻豆小说| a视频在线播放| 欧美视频三区在线播放| 国产中文字幕一区二区| 欧美日韩国产一区精品一区| 国产专区精品视频| 97视频在线观看网站| 婷婷夜色潮精品综合在线| 丰满少妇中文字幕| 婷婷综合激情| 国产精品视频在线播放| 国产高清视频在线| 日本二三区不卡| free性中国hd国语露脸| 一区免费视频| 国产精品国产亚洲精品看不卡15| 国产福利在线播放麻豆| 欧美精品日韩综合在线| 国产精品久久久免费看| 日韩电影免费在线看| 欧美在线视频一区二区三区| 欧美freesex黑人又粗又大| 亚洲精品国偷自产在线99热 | 性欧美欧美巨大69| 国产精品网红直播| 北条麻妃在线| 欧美三级视频在线| 天堂av网手机版| 免费观看30秒视频久久| 亚洲精蜜桃久在线| 自拍偷拍亚洲图片| 久久精品视频亚洲| 国产强伦人妻毛片| 亚洲免费av高清| 色婷婷狠狠18禁久久| 欧美日韩视频| 国产aⅴ精品一区二区三区黄| 国内小视频在线看| 日韩成人中文电影| 久操视频在线免费观看| 欧美国产精品久久| 天天操精品视频| 欧美fxxxxxx另类| 粉嫩高清一区二区三区精品视频| aa级大片免费在线观看| 亚洲精品www| 亚洲午夜无码久久久久| 国产精品高潮呻吟| 亚洲国产欧美日韩在线| 亚洲日韩视频| 秋霞毛片久久久久久久久| 不卡亚洲精品| 欧美精品在线免费观看| 亚洲女同志亚洲女同女播放| 精品国产老师黑色丝袜高跟鞋| 不卡一区二区在线观看| 久久精品国产精品青草| 久久www视频| 日韩电影在线观看完整免费观看| 国产极品jizzhd欧美| 国产黄大片在线观看画质优化| 精品国产伦一区二区三区免费| 国产精品久久久久久久妇| 国产三级一区二区| 99久久99精品| 国产亚洲欧洲| 在线免费观看成人网| 一区三区自拍| 国产精品久久久久久久久久尿 | 国产伦精品一区二区三区在线播放| 992tv成人免费视频| 1024国产在线| 亚洲电影中文字幕| 中文字幕人妻一区二区在线视频| 亚洲乱码国产乱码精品精的特点| www.88av| 国产一区二区成人久久免费影院 | 女女百合国产免费网站| 香蕉视频亚洲一级| 欧美成人免费播放| 国产在线日本| 精品乱人伦一区二区三区| 性高潮视频在线观看| 亚洲国产精品一区二区久久 | 日本www.色| 国产精品成人一区二区网站软件| 日韩免费一区二区三区| jizz国产精品| 国产日产欧美a一级在线| 国产理论在线| www国产精品视频| 牛牛热在线视频| 精品精品欲导航| 国产又粗又猛视频| 色综合中文综合网| 欧美日韩中文字幕在线观看| 国产日韩欧美电影| 一区二区三区四区不卡| 亚洲欧美另类视频| 色综合天天综合网天天狠天天| 五月天色婷婷丁香| 国产日韩精品一区二区三区在线| 一区二区三区四区影院| 久久99热99| 欧美 日韩 国产 激情| 99视频一区| 国产美女永久无遮挡| 国产精品久久久久无码av| 日本一区二区三区四区高清视频 | 亚洲永久在线观看| 精品亚洲美女网站| 91av在线免费观看视频| 天堂av中文在线| 久久九九免费视频| aaa日本高清在线播放免费观看| 日韩av在线网| 国产 欧美 精品| 日韩一区二区高清| 国产三级自拍视频| 6080亚洲精品一区二区| 中文无码精品一区二区三区| 色偷偷久久一区二区三区| 全部毛片永久免费看| 亚洲午夜精品网| 麻豆91精品91久久久| 一区二区三区小说| 国产精品久久久久久久精| 亚洲欧美一区二区三区久本道91| 性爱在线免费视频| 中文字幕人成不卡一区| 国产第一页浮力| 亚洲欧美一区二区三区孕妇| 91在线播放观看| 亚洲影院免费观看| 久青草免费视频| 亚洲成人免费视| 国产午夜在线播放| 色哟哟国产精品| 精品乱码一区内射人妻无码| 欧美日韩电影在线播放| 国产免费一区二区三区最新不卡 | 爽爽爽在线观看| 国内精品国产成人| 性生活在线视频| 成年人国产精品| 中文人妻一区二区三区| 国产午夜精品在线观看| 老司机福利在线观看| 亚洲欧洲国产专区| 久久这里只有精品国产| 精品久久久久久久久久久久久| 日韩欧美成人一区二区三区| 色成年激情久久综合| 亚洲视频在线观看一区二区| 日韩欧美中文一区二区| 人人妻人人玩人人澡人人爽| 亚洲欧美变态国产另类| 秋霞午夜在线观看| 韩国三级日本三级少妇99| 玛雅亚洲电影| 国产综合在线观看视频| 都市激情久久| 日韩视频在线播放| 欧美日本在线| 毛片在线视频播放| 久久99精品国产| chinese麻豆新拍video| 久久精品水蜜桃av综合天堂| 日韩在线视频网址| 精品欧美国产一区二区三区| 在线观看黄色国产| 亚洲成人久久网| av资源网在线观看| 国内精品久久影院| 欧美亚洲人成在线| 久久人人97超碰人人澡爱香蕉| 97视频精品| 久久无码高潮喷水| 精品一区二区三区免费毛片爱 | 久久久91精品国产一区二区精品 | 亚洲国产精品一区二区尤物区| 男人天堂视频在线| 精品国产91洋老外米糕| 成人在线高清视频| 91精品国产高清久久久久久| 四虎影视成人精品国库在线观看| 久久精品二区| 欧美视频四区| www午夜视频| 久久久综合精品| 久久久久亚洲AV成人| 欧美色网站导航| 巨骚激情综合| 91国产精品电影| av成人资源| 国产av不卡一区二区| 日本亚洲一区二区| 波多野结衣影院| 亚洲曰韩产成在线| 国产精品久久婷婷| 色噜噜国产精品视频一区二区| 看黄在线观看| 国产亚洲欧美一区二区三区| 亚洲综合小说| 日本高清一区二区视频| 国产三级精品三级| 精品国产xxx| 日韩激情视频在线| 电影在线观看一区| 91黄色国产视频| 最新国产精品| 交换做爰国语对白| 综合电影一区二区三区| 成人黄色免费网| 国产一区二区三区在线播放免费观看| 国产v日韩v欧美v| 国产福利久久精品| 国产综合亚洲精品一区二| 熟妇无码乱子成人精品| 亚洲欧美二区三区| 国产男女裸体做爰爽爽| 久久久精品亚洲| 国产乱码精品一区二区三区亚洲人| 一区二区三区的久久的视频| 青青草视频一区| 精品伦精品一区二区三区视频密桃| 欧美亚洲图片小说| 成人p站proumb入口| 国产精品亚洲аv天堂网| 日韩精品第一区| 97人人爽人人| 亚洲精品日韩一| 午夜免费福利视频| 国语对白做受69| 台湾亚洲精品一区二区tv| 国产精品亚洲a| 国产精品系列在线| 国产免费无遮挡| 欧美黑人国产人伦爽爽爽| 久久精品论坛| 亚洲爆乳无码专区| 国产精品婷婷午夜在线观看| 91禁在线观看| 欧美高清在线视频观看不卡| 国产一区丝袜| 北条麻妃视频在线| 一区视频在线播放| www.亚洲欧美| 91av在线网站| 热久久天天拍国产| 北条麻妃亚洲一区| 红桃av永久久久| 免费黄色在线视频网站| 国产精品一区久久| 国产在线欧美| 亚洲成人黄色av| 欧美一区二区在线免费观看| 91色在线看| 天天爽天天狠久久久| 国产精品综合av一区二区国产馆| 日韩欧美亚洲国产| 中文字幕不卡在线视频极品| 国产精品久久久久久久久久久久久久久 | 国产超碰人人模人人爽人人添| 久久久久久久久国产精品| 天堂av一区二区三区在线播放| 污视频网址在线观看| 亚洲国产日韩a在线播放| 国产三级在线| 春色成人在线视频| 青青草国产精品亚洲专区无| 久久亚洲精品大全|