SQL?Server使用T-SQL語(yǔ)句批處理
批處理簡(jiǎn)介
批處理是作為一個(gè)邏輯單元的T-SQL語(yǔ)句。如果一條語(yǔ)句不能通過(guò)語(yǔ)法分析,那么不會(huì)運(yùn)行任何語(yǔ)句。如果一條語(yǔ)句在運(yùn)行時(shí)失敗,那么產(chǎn)生錯(cuò)誤的語(yǔ)句之前的語(yǔ)句都已經(jīng)運(yùn)行了。
為了將一個(gè)腳本分為多個(gè)批處理,可使用GO語(yǔ)句。
GO語(yǔ)句的特點(diǎn):
- GO語(yǔ)句必須自成一行,只有注釋可以再同一行上。
- 它使得自腳本的開(kāi)始部分或者最近一個(gè)GO語(yǔ)句以后的所有語(yǔ)句編譯成一個(gè)執(zhí)行計(jì)劃并發(fā)送到服務(wù)器,與任何其他批處理無(wú)關(guān)。
- GO語(yǔ)句不是T-SQL命令,而是由各種SQL Server命令實(shí)用程序(如:Management Studio中的"查詢(xún)"窗口)識(shí)別的命令。
1、自成一行
GO命令應(yīng)當(dāng)自成一行。在技術(shù)上,可以在GO命令之后的同一行開(kāi)始一個(gè)新的批處理,但是這會(huì)嚴(yán)重影響可讀性。T-SQL語(yǔ)句不能放在GO語(yǔ)句之前,否則GO語(yǔ)句經(jīng)常會(huì)被錯(cuò)誤地理解,從而造成語(yǔ)法分析錯(cuò)誤或產(chǎn)生一些不可預(yù)料的后果。例如,在WHERE子句之后使用一個(gè)GO語(yǔ)句。
SELECT * FROM Person WHERE Id = 100 GO
分析器就不知道如何處理。
消息 102,級(jí)別 15,狀態(tài) 1,第 1 行 'GO' 附近有語(yǔ)法錯(cuò)誤。
2、每個(gè)批處理單獨(dú)發(fā)送到服務(wù)器
因?yàn)槊總€(gè)批處理被單獨(dú)地處理,所以一個(gè)批處理中的錯(cuò)誤不會(huì)阻止另一個(gè)批處理運(yùn)行。要說(shuō)明這點(diǎn),請(qǐng)看一下下面的代碼。
SELECT 1/0 GO SELECT 0/1
如果這些批處理之間沒(méi)有任何依賴(lài)性,則每個(gè)批處理在運(yùn)行時(shí)是完全自治的。
消息 8134,級(jí)別 16,狀態(tài) 1,第 1 行 遇到以零作除數(shù)錯(cuò)誤。 (1 行受影響)
如果這些批處理之間存在依賴(lài)性,那么錯(cuò)誤發(fā)生之后的每個(gè)批處理都會(huì)失敗。依賴(lài)性指的是后面的語(yǔ)句,依賴(lài)前面執(zhí)行的結(jié)果或變量等等?! ?/p>
3、GO不是T-SQL命令
一個(gè)常見(jiàn)的錯(cuò)誤是認(rèn)為GO是T-SQL命令,其實(shí)GO是一個(gè)只能被編輯工具(Management Studio)識(shí)別的命令。
當(dāng)編輯工具遇到GO語(yǔ)句時(shí),會(huì)將GO語(yǔ)句看做一個(gè)終止批處理的標(biāo)記,將其打包,并且作為一個(gè)獨(dú)立的單元發(fā)送到服務(wù)器,不包括GO。因?yàn)榉?wù)器本身根本不知道GO是什么意思。
批處理中錯(cuò)誤
批處理中的錯(cuò)誤分為以下兩類(lèi):
- 語(yǔ)法錯(cuò)誤
- 運(yùn)行時(shí)錯(cuò)誤
如果查詢(xún)分析器發(fā)現(xiàn)一個(gè)語(yǔ)法錯(cuò)誤,那么批處理的處理過(guò)程會(huì)被立即取消。因?yàn)檎Z(yǔ)法檢查發(fā)生在批處理編譯或者執(zhí)行之前,所以在語(yǔ)法檢查期間的一個(gè)失敗意味著還沒(méi)有批處理被執(zhí)行-不管語(yǔ)法錯(cuò)誤發(fā)生在批處理中的什么位置。
運(yùn)行時(shí)錯(cuò)誤的工作方式有很大不同,因?yàn)槿魏卧谟龅竭\(yùn)行時(shí)錯(cuò)誤之前執(zhí)行的語(yǔ)句已經(jīng)完成了,所以除非是未提交事務(wù)的一部分,否則這些語(yǔ)句所做的任何事情都已經(jīng)是現(xiàn)實(shí)了。
一般而言,運(yùn)行時(shí)錯(cuò)誤將終止從錯(cuò)誤發(fā)生的地方到此批處理末端的批處理的執(zhí)行。下一個(gè)批處理不影響。
何時(shí)使用批處理
使用批處理有若干個(gè)理由,但是所有的批處理都有一個(gè)共同點(diǎn)-當(dāng)腳本中的一些事情必須發(fā)生在另外一件事情之前或者分開(kāi)發(fā)生時(shí),需要使用批處理。
1.要求有自己的批處理的語(yǔ)句
有一些命令必須有他們自己的批處理。
- CREATE DEFAULT
- CREATE PROCEDURE
- CREATE RULE
- CREATE TRIGGER
- CREATE VIEW
如果想在單個(gè)腳本中將這些語(yǔ)句中的任意一個(gè)和其他語(yǔ)句進(jìn)行組合,那么需要通過(guò)使用GO語(yǔ)句將他們分散到各自的批處理中。
2、使用批處理建立優(yōu)先權(quán)
當(dāng)需要建立優(yōu)先權(quán)時(shí),就可能用到批處理。也就是說(shuō),在下一個(gè)任務(wù)開(kāi)始之前,需要全部完成上一個(gè)任務(wù)。在大多數(shù)時(shí)候,SQL Server可以很好地處理這種情況 - 腳本中的第一條語(yǔ)句是首先執(zhí)行的,并且腳本中的第二條語(yǔ)句可以依賴(lài)第二條語(yǔ)句運(yùn)行時(shí)服務(wù)器所處的適當(dāng)狀態(tài)。
下面來(lái)看一個(gè)例子:
USE master CREATE DATABASE Test CREATE TABLE TestTable ( col1 int, col2 int )
當(dāng)執(zhí)行上面的腳本,提示命令已成功完成。但是真的沒(méi)問(wèn)題嗎?
當(dāng)查看Test數(shù)據(jù)庫(kù)時(shí),發(fā)現(xiàn)表TestTable并不存在,反而master數(shù)據(jù)庫(kù)里多了一個(gè)TestTable表。
為什么表被創(chuàng)建在了master數(shù)據(jù)庫(kù)中,答案取決于當(dāng)運(yùn)行CREATE TABLE語(yǔ)句時(shí),當(dāng)前數(shù)據(jù)庫(kù)是什么。在這個(gè)例子中,它恰好是master數(shù)據(jù)庫(kù),所以表就創(chuàng)建在該數(shù)據(jù)庫(kù)中。
你可能以為將上述代碼改成這樣可能就能夠解決:
CREATE DATABASE Test USE Test CREATE TABLE TestTable ( col1 int, col2 int )
但很遺憾,并不能,錯(cuò)誤信息如下:
消息 911,級(jí)別 16,狀態(tài) 1,第 3 行 數(shù)據(jù)庫(kù) 'Test' 不存在。請(qǐng)確保正確地輸入了該名稱(chēng)。
分析器嘗試驗(yàn)證代碼時(shí),發(fā)現(xiàn)USE引用一個(gè)不存在的數(shù)據(jù)庫(kù),這是批處理語(yǔ)句不可或缺,正確的代碼如下:
CREATE DATABASE Test GO --此GO是兩主角 USE Test CREATE TABLE TestTable ( col1 int, col2 int )
就這樣加了一個(gè)GO之后,問(wèn)題成功解決。
下面再來(lái)看一個(gè)例子:
USE Test ALTER TABLE TestTable ADD col3 int INSERT INTO TestTable (col1,col2,col3) VALUES (1,1,1)
以上代碼在查詢(xún)分析器中提示col3列不存在。實(shí)際上,以上代碼也可以通過(guò)一個(gè)GO解決。
USE Test ALTER TABLE TestTable ADD col3 int GO --先更改數(shù)據(jù)庫(kù),然發(fā)送插入,此時(shí)就是分開(kāi)進(jìn)行語(yǔ)法驗(yàn)證了 INSERT INTO TestTable (col1,col2,col3) VALUES (1,1,1)
到此這篇關(guān)于SQL Server批處理T-SQL語(yǔ)句的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SQL Server Transact-SQL編程詳解
- SQL Server 的T-SQL高級(jí)查詢(xún)?cè)斀?/a>
- Sql Server數(shù)據(jù)庫(kù)常用Transact-SQL腳本(推薦)
- SQL Server中T-SQL 數(shù)據(jù)類(lèi)型轉(zhuǎn)換詳解
- SQLServer用t-sql命令批量刪除數(shù)據(jù)庫(kù)中指定表(游標(biāo)循環(huán)刪除)
- 如何在SQL Server 2008下輕松調(diào)試T-SQL語(yǔ)句和存儲(chǔ)過(guò)程
- SQL Server中的T-SQL的基本對(duì)象
- SQLServer 2008 新增T-SQL 簡(jiǎn)寫(xiě)語(yǔ)法
相關(guān)文章
sqlserver 數(shù)據(jù)庫(kù)被注入解決方案
定義要去除的字符,請(qǐng)注意,肯定不止一條,我的服務(wù)器就查到許多不同的代碼2010-05-05sql時(shí)間格式化輸出、Convert函數(shù)應(yīng)用示例
這篇文章主要介紹了sql時(shí)間格式化輸出、Convert函數(shù)應(yīng)用,需要的朋友可以參考下2014-03-03sqlserverdriver配置方法 jdbc連接sqlserver
這篇文章主要介紹了sqlserverdriver配置方法,介紹了連接SqlServer2000 和連接SqlServer2005的方法,大家參考使用吧2014-01-01sqlserver 手工實(shí)現(xiàn)差異備份的步驟
sqlserver 手工實(shí)現(xiàn)差異備份的步驟,需要的朋友可以參考下。2011-04-04SQL Server 2005降級(jí)到2000的正確操作步驟分享
這篇文章主要和大家一起分享的是SQL Server 2005導(dǎo)入到SQL Server 2000的正確操作步驟,下面就是文章的主要內(nèi)容描述2014-04-04CentOS 7.3上SQL Server vNext CTP 1.2安裝教程
這篇文章主要為大家詳細(xì)介紹了CentOS 7.3上SQL Server vNext CTP 1.2安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
重復(fù)數(shù)據(jù),通常有兩種:一是完全重復(fù)的記錄,也就是所有字段的值都一樣;二是部分字段值重復(fù)的記錄2013-05-05