精品国产亚洲一区二区三区,男女作爱在线观看免费网站,欧美的又大又长做禁片A片,97国产精品人妻无码久久久
注冊(cè)
|
提交需求
|
訂閱
|
English
首 頁
解決方案
產(chǎn) 品
服 務(wù)
支 持
EDN系統(tǒng)
成功案例
關(guān)于我們
聯(lián)系我們
樹結(jié)構(gòu)圖
EDN系統(tǒng)
圖形圖像
網(wǎng)絡(luò)安全
項(xiàng)目專題
WEB開發(fā)
辦公系列
操作系統(tǒng)
數(shù)據(jù)庫
程序設(shè)計(jì)
TOP 10
在Foxmail中如何使…
Ftp 子命令
BigDecimal
MSN在線客服功能模塊使…
會(huì)員卡使用方法說明
DataInputStr…
留言板功能說明
CScript
BufferedInpu…
設(shè)置打印機(jī)
您現(xiàn)在的位置:
>
技術(shù)沙龍
>
數(shù)據(jù)庫
>
SQL Server
>
未分類
>
SQL Server(存儲(chǔ)過程)臨時(shí)表與滯后名稱解析
相關(guān)軟件
>
SQL Server(存儲(chǔ)過程)臨時(shí)表與滯后名稱解析
創(chuàng)建者:
webmaster
更新時(shí)間:
2022-01-13
10:18
開發(fā)中,我們經(jīng)常用Create Procedure命令創(chuàng)建存儲(chǔ)過程,而在創(chuàng)建過程時(shí)實(shí)際發(fā)生的是,Query Analyzer檢查其語法,檢查完畢并正確后將其插入系統(tǒng)表syscomments中,而在過程中引用的對(duì)象名稱在該過程被執(zhí)行之前不被解析,這個(gè)技術(shù)叫做滯后名稱解析。然而,這個(gè)技術(shù)卻并不是和我們想象的一樣,它也有鞭長(zhǎng)莫及的地方。下面來看一個(gè)過程:
CREATE PROC testp @var int
AS
IF @var=1
CREATE TABLE #mytemp(k1 int identity,c1 int)
ELSE
CREATE TABLE #mytemp(k1 int identity,c1 varchar(2))
INSERT #mytemp DEFAULT VALUES
SELECT c1 FROM #mytemp
GO
當(dāng)編譯該過程時(shí),出現(xiàn)以下錯(cuò)誤:
也許你會(huì)問,@var不可能既等于1又不等于1,那問什麼會(huì)出現(xiàn)以上的錯(cuò)誤呢?大家不要頭暈,現(xiàn)在是在檢查語法的時(shí)候,檢查語法是逐行向下的,編譯器不會(huì)管你的@var等不等于1,它只檢查語法錯(cuò)誤!可能你又要說:上面不是說對(duì)象名稱滯后解析嗎?臨時(shí)表就是一個(gè)對(duì)象啊,而#mytemp是它的名稱,既然是滯后解析,那就是忽略該名稱不解析,怎麼可能會(huì)出現(xiàn)這種錯(cuò)誤,別急,問題就出在這里!對(duì)比看一下下面的過程:
CREATE PROC testp2 @var int
AS
IF @var=1
CREATE TABLE tempdb..mytemp(k1 int identity,c1 int)
ELSE
CREATE TABLE tempdb..mytemp(k1 int identity,c1 varchar(2))
INSERT mytemp DEFAULT VALUES
SELECT c1 FROM mytemp
GO
奇怪的事情發(fā)生了,創(chuàng)建這個(gè)過程順利地通過,這里只是把臨時(shí)表替換成了一個(gè)永久性表,并沒做
其他
任何改變,難道SQL Server在乎創(chuàng)建的是臨時(shí)表還是永久性表,呵呵?發(fā)生的事情似乎是這樣的,在將過程插入syscomments之前(存儲(chǔ)過程編譯后存放于系統(tǒng)表syscomments中), SQL Server參照臨時(shí)表解析CREATE TABLE,也許你會(huì)說將臨時(shí)表換成一個(gè)table類型的變量就不會(huì)出現(xiàn)這樣的問題,可是事實(shí)是不行,數(shù)據(jù)類型table同樣受此局限。似乎是從SQL Server 7.0開始,支持永久性表的滯后名稱解析,但不支持臨時(shí)表的滯后名稱解析。但不管是哪一種情況,第一個(gè)代碼都無法執(zhí)行,下面采取一個(gè)迂回策略來解決這個(gè)問題,請(qǐng)看:
CREATE PROC testp @var int
AS
CREATE TABLE #mytemp(k1 int identity)
IF @var=1
ALTER TABLE #mytemp ADD c1 int
ELSE
ALTER TABLE #mytemp ADD c1 varchar(2)
INSERT #mytemp DEFAULT VALUES
EXEC('SELECT c1 FROM #mytemp')
GO
在這里只創(chuàng)建表一次,然后修改它,注意`EXEC('SELECT c1 FROM #mytemp')'
這條語句是必要的,因??新添加的列對(duì)于添加它的過程并非立即可見,如果去掉EXEC執(zhí)行該過程時(shí),將會(huì)顯示這樣的錯(cuò)誤:
再説一次,新添加的列對(duì)于添加它的過程并非立即可見!然而以上的代碼卻帶來了一個(gè)性能問題,因??任何創(chuàng)建臨時(shí)表并近一步處理它的存儲(chǔ)過程都將導(dǎo)致該過程的執(zhí)行計(jì)劃重新編譯,這對(duì)于高吞吐量環(huán)境中的大型過程而言,性能會(huì)大打折扣!以下過程將解決這個(gè)問題:
CREATE PROC test4
AS
INSERT #temp DEFAULT VALUES
SELECT c1 FROM #temp
GO
CREATE PROC test3
AS
CREATE TABLE #temp (k1 int identity,c1 varchar(2))
EXEC dbo.test4
GO
CREATE PROC test2
AS
CREATE TABLE #temp (k1 int identity,c1 int)
EXEC dbo.test4
GO
CREATE PROC test @var int
AS
IF @var=1
EXEC dbo.test2
ELSE
EXEC dbo.test3
GO
復(fù)雜性提高了,但是還是可以解決一些問題,另外,之所以在第二和第三個(gè)過程中冗余地調(diào)用第四個(gè)過程,是因??臨時(shí)表一旦超過其作用域就自動(dòng)被刪除!
相關(guān)文章
后一則:
將SQL SERVER中所有表的列信息顯示出來〔總結(jié)〕
本頁查看次數(shù):
公司公告
|
客戶調(diào)查
|
法律聲明
|
誠(chéng)聘英才
|
給我們投稿
|
繁
閃
頭像
京ICP備05031245號(hào)
Copyright @ REDCOME.com ALL Rights Reserved
北京怡康軟件科技有限公司 地址:北京市昌平區(qū)東小口立湯路188號(hào)北方明珠大廈1號(hào)樓2708 郵編:102218 電話:84909966 傳真:84909900 QQ:335601661