溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

SQL?Server怎么使用T-SQL語句批處理

發(fā)布時(shí)間:2022-05-20 14:28:35 來源:億速云 閱讀:207 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“SQL Server怎么使用T-SQL語句批處理”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

批處理簡介

批處理是作為一個(gè)邏輯單元的T-SQL語句。如果一條語句不能通過語法分析,那么不會(huì)運(yùn)行任何語句。如果一條語句在運(yùn)行時(shí)失敗,那么產(chǎn)生錯(cuò)誤的語句之前的語句都已經(jīng)運(yùn)行了。

為了將一個(gè)腳本分為多個(gè)批處理,可使用GO語句。

GO語句的特點(diǎn):

  • GO語句必須自成一行,只有注釋可以再同一行上。

  • 它使得自腳本的開始部分或者最近一個(gè)GO語句以后的所有語句編譯成一個(gè)執(zhí)行計(jì)劃并發(fā)送到服務(wù)器,與任何其他批處理無關(guān)。

  • GO語句不是T-SQL命令,而是由各種SQL Server命令實(shí)用程序(如:Management Studio中的"查詢"窗口)識(shí)別的命令。

1、自成一行

GO命令應(yīng)當(dāng)自成一行。在技術(shù)上,可以在GO命令之后的同一行開始一個(gè)新的批處理,但是這會(huì)嚴(yán)重影響可讀性。T-SQL語句不能放在GO語句之前,否則GO語句經(jīng)常會(huì)被錯(cuò)誤地理解,從而造成語法分析錯(cuò)誤或產(chǎn)生一些不可預(yù)料的后果。例如,在WHERE子句之后使用一個(gè)GO語句。

SELECT * FROM Person WHERE Id = 100 GO

分析器就不知道如何處理。

消息 102,級(jí)別 15,狀態(tài) 1,第 1 行
  'GO' 附近有語法錯(cuò)誤。

2、每個(gè)批處理單獨(dú)發(fā)送到服務(wù)器

因?yàn)槊總€(gè)批處理被單獨(dú)地處理,所以一個(gè)批處理中的錯(cuò)誤不會(huì)阻止另一個(gè)批處理運(yùn)行。要說明這點(diǎn),請看一下下面的代碼。

SELECT 1/0
  GO
  SELECT 0/1

如果這些批處理之間沒有任何依賴性,則每個(gè)批處理在運(yùn)行時(shí)是完全自治的。

消息 8134,級(jí)別 16,狀態(tài) 1,第 1 行
  遇到以零作除數(shù)錯(cuò)誤。

  (1 行受影響)

如果這些批處理之間存在依賴性,那么錯(cuò)誤發(fā)生之后的每個(gè)批處理都會(huì)失敗。依賴性指的是后面的語句,依賴前面執(zhí)行的結(jié)果或變量等等?! ?/p>

3、GO不是T-SQL命令

一個(gè)常見的錯(cuò)誤是認(rèn)為GO是T-SQL命令,其實(shí)GO是一個(gè)只能被編輯工具(Management Studio)識(shí)別的命令。

當(dāng)編輯工具遇到GO語句時(shí),會(huì)將GO語句看做一個(gè)終止批處理的標(biāo)記,將其打包,并且作為一個(gè)獨(dú)立的單元發(fā)送到服務(wù)器,不包括GO。因?yàn)榉?wù)器本身根本不知道GO是什么意思。

批處理中錯(cuò)誤

批處理中的錯(cuò)誤分為以下兩類:

  • 語法錯(cuò)誤

  • 運(yùn)行時(shí)錯(cuò)誤

如果查詢分析器發(fā)現(xiàn)一個(gè)語法錯(cuò)誤,那么批處理的處理過程會(huì)被立即取消。因?yàn)檎Z法檢查發(fā)生在批處理編譯或者執(zhí)行之前,所以在語法檢查期間的一個(gè)失敗意味著還沒有批處理被執(zhí)行-不管語法錯(cuò)誤發(fā)生在批處理中的什么位置。

運(yùn)行時(shí)錯(cuò)誤的工作方式有很大不同,因?yàn)槿魏卧谟龅竭\(yùn)行時(shí)錯(cuò)誤之前執(zhí)行的語句已經(jīng)完成了,所以除非是未提交事務(wù)的一部分,否則這些語句所做的任何事情都已經(jīng)是現(xiàn)實(shí)了。

一般而言,運(yùn)行時(shí)錯(cuò)誤將終止從錯(cuò)誤發(fā)生的地方到此批處理末端的批處理的執(zhí)行。下一個(gè)批處理不影響。

何時(shí)使用批處理

使用批處理有若干個(gè)理由,但是所有的批處理都有一個(gè)共同點(diǎn)-當(dāng)腳本中的一些事情必須發(fā)生在另外一件事情之前或者分開發(fā)生時(shí),需要使用批處理。

1.要求有自己的批處理的語句

有一些命令必須有他們自己的批處理。

  • CREATE DEFAULT

  • CREATE PROCEDURE

  • CREATE RULE

  • CREATE TRIGGER

  • CREATE VIEW

如果想在單個(gè)腳本中將這些語句中的任意一個(gè)和其他語句進(jìn)行組合,那么需要通過使用GO語句將他們分散到各自的批處理中。

2、使用批處理建立優(yōu)先權(quán)

當(dāng)需要建立優(yōu)先權(quán)時(shí),就可能用到批處理。也就是說,在下一個(gè)任務(wù)開始之前,需要全部完成上一個(gè)任務(wù)。在大多數(shù)時(shí)候,SQL Server可以很好地處理這種情況 - 腳本中的第一條語句是首先執(zhí)行的,并且腳本中的第二條語句可以依賴第二條語句運(yùn)行時(shí)服務(wù)器所處的適當(dāng)狀態(tài)。

下面來看一個(gè)例子:

USE master

  CREATE DATABASE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

當(dāng)執(zhí)行上面的腳本,提示命令已成功完成。但是真的沒問題嗎?

當(dāng)查看Test數(shù)據(jù)庫時(shí),發(fā)現(xiàn)表TestTable并不存在,反而master數(shù)據(jù)庫里多了一個(gè)TestTable表。

為什么表被創(chuàng)建在了master數(shù)據(jù)庫中,答案取決于當(dāng)運(yùn)行CREATE TABLE語句時(shí),當(dāng)前數(shù)據(jù)庫是什么。在這個(gè)例子中,它恰好是master數(shù)據(jù)庫,所以表就創(chuàng)建在該數(shù)據(jù)庫中。

你可能以為將上述代碼改成這樣可能就能夠解決:

CREATE DATABASE Test

  USE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

但很遺憾,并不能,錯(cuò)誤信息如下:

消息 911,級(jí)別 16,狀態(tài) 1,第 3 行
  數(shù)據(jù)庫 'Test' 不存在。請確保正確地輸入了該名稱。

分析器嘗試驗(yàn)證代碼時(shí),發(fā)現(xiàn)USE引用一個(gè)不存在的數(shù)據(jù)庫,這是批處理語句不可或缺,正確的代碼如下:

CREATE DATABASE Test
  GO  --此GO是兩主角
  USE Test

  CREATE TABLE TestTable
  (
      col1 int,
      col2 int
  )

就這樣加了一個(gè)GO之后,問題成功解決。

下面再來看一個(gè)例子:

USE Test
  ALTER TABLE TestTable
      ADD col3 int
  INSERT INTO TestTable
      (col1,col2,col3)
  VALUES
      (1,1,1)

以上代碼在查詢分析器中提示col3列不存在。實(shí)際上,以上代碼也可以通過一個(gè)GO解決。

USE Test
  ALTER TABLE TestTable
      ADD col3 int
  GO  --先更改數(shù)據(jù)庫,然發(fā)送插入,此時(shí)就是分開進(jìn)行語法驗(yàn)證了
  INSERT INTO TestTable
      (col1,col2,col3)
  VALUES
      (1,1,1)

“SQL Server怎么使用T-SQL語句批處理”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI