<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
批次處理是作為一個邏輯單元的T-SQL語句。如果一條語句不能通過語法分析,那麼不會執行任何語句。如果一條語句在執行時失敗,那麼產生錯誤的語句之前的語句都已經執行了。
為了將一個指令碼分為多個批次處理,可使用GO語句。
GO語句的特點:
GO命令應當自成一行。在技術上,可以在GO命令之後的同一行開始一個新的批次處理,但是這會嚴重影響可讀性。T-SQL語句不能放在GO語句之前,否則GO語句經常會被錯誤地理解,從而造成語法分析錯誤或產生一些不可預料的後果。例如,在WHERE子句之後使用一個GO語句。
SELECT * FROM Person WHERE Id = 100 GO
分析器就不知道如何處理。
訊息 102,級別 15,狀態 1,第 1 行 'GO' 附近有語法錯誤。
因為每個批次處理被單獨地處理,所以一個批次處理中的錯誤不會阻止另一個批次處理執行。要說明這點,請看一下下面的程式碼。
SELECT 1/0 GO SELECT 0/1
如果這些批次處理之間沒有任何依賴性,則每個批次處理在執行時是完全自治的。
訊息 8134,級別 16,狀態 1,第 1 行 遇到以零作除數錯誤。 (1 行受影響)
如果這些批次處理之間存在依賴性,那麼錯誤發生之後的每個批次處理都會失敗。依賴性指的是後面的語句,依賴前面執行的結果或變數等等。
一個常見的錯誤是認為GO是T-SQL命令,其實GO是一個只能被編輯工具(Management Studio)識別的命令。
當編輯工具遇到GO語句時,會將GO語句看做一個終止批次處理的標記,將其打包,並且作為一個獨立的單元傳送到伺服器,不包括GO。因為伺服器本身根本不知道GO是什麼意思。
批次處理中的錯誤分為以下兩類:
如果查詢分析器發現一個語法錯誤,那麼批次處理的處理過程會被立即取消。因為語法檢查發生在批次處理編譯或者執行之前,所以在語法檢查期間的一個失敗意味著還沒有批次處理被執行-不管語法錯誤發生在批次處理中的什麼位置。
執行時錯誤的工作方式有很大不同,因為任何在遇到執行時錯誤之前執行的語句已經完成了,所以除非是未提交事務的一部分,否則這些語句所做的任何事情都已經是現實了。
一般而言,執行時錯誤將終止從錯誤發生的地方到此批次處理末端的批次處理的執行。下一個批次處理不影響。
使用批次處理有若干個理由,但是所有的批次處理都有一個共同點-當指令碼中的一些事情必須發生在另外一件事情之前或者分開發生時,需要使用批次處理。
有一些命令必須有他們自己的批次處理。
如果想在單個指令碼中將這些語句中的任意一個和其他語句進行組合,那麼需要通過使用GO語句將他們分散到各自的批次處理中。
當需要建立優先權時,就可能用到批次處理。也就是說,在下一個任務開始之前,需要全部完成上一個任務。在大多數時候,SQL Server可以很好地處理這種情況 - 指令碼中的第一條語句是首先執行的,並且指令碼中的第二條語句可以依賴第二條語句執行時伺服器所處的適當狀態。
下面來看一個例子:
USE master CREATE DATABASE Test CREATE TABLE TestTable ( col1 int, col2 int )
當執行上面的指令碼,提示命令已成功完成。但是真的沒問題嗎?
當檢視Test資料庫時,發現表TestTable並不存在,反而master資料庫裡多了一個TestTable表。
為什麼表被建立在了master資料庫中,答案取決於當執行CREATE TABLE語句時,當前資料庫是什麼。在這個例子中,它恰好是master資料庫,所以表就建立在該資料庫中。
你可能以為將上述程式碼改成這樣可能就能夠解決:
CREATE DATABASE Test USE Test CREATE TABLE TestTable ( col1 int, col2 int )
但很遺憾,並不能,錯誤資訊如下:
訊息 911,級別 16,狀態 1,第 3 行 資料庫 'Test' 不存在。請確保正確地輸入了該名稱。
分析器嘗試驗證程式碼時,發現USE參照一個不存在的資料庫,這是批次處理語句不可或缺,正確的程式碼如下:
CREATE DATABASE Test GO --此GO是兩主角 USE Test CREATE TABLE TestTable ( col1 int, col2 int )
就這樣加了一個GO之後,問題成功解決。
下面再來看一個例子:
USE Test ALTER TABLE TestTable ADD col3 int INSERT INTO TestTable (col1,col2,col3) VALUES (1,1,1)
以上程式碼在查詢分析器中提示col3列不存在。實際上,以上程式碼也可以通過一個GO解決。
USE Test ALTER TABLE TestTable ADD col3 int GO --先更改資料庫,然傳送插入,此時就是分開進行語法驗證了 INSERT INTO TestTable (col1,col2,col3) VALUES (1,1,1)
到此這篇關於SQL Server批次處理T-SQL語句的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45