【twfx118】SQL語句中GO 和EXEC是什麼意思

iDotNetSpace發表於2008-07-28
GO
用訊號通知 Microsoft® SQL Server™ 實用工具一批 Transact-SQL 語句的結束。
語法
GO
註釋
GO 不是 Transact-SQL 語句;而是可為 osql 和 isql 實用工具及 SQL Server 查詢分析器識別的命令。
SQL Server 實用工具將 GO 解釋為應將當前的 Transact-SQL 批處理語句傳送給 SQL Server 的訊號。當前批處理語句是自上一 GO 命令後輸入的所有語句,若是第一條 GO 命令,則是從特殊會話或指令碼的開始處到這條 GO 命令之間的所有語句。SQL 查詢分析器和 osql 及 isql 命令提示實用工具執行 GO 命令的方式不同。有關更多資訊,請參見 osql 實用工具、isql 實用工具和 SQL 查詢分析器。 
GO 命令和Transact-SQL 語句不可在同一行上。但在 GO 命令列中可包含註釋。
使用者必須遵照使用批處理的規則。例如,在批處理中的第一條語句後執行任何儲存過程必須包含 EXECUTE 關鍵字。區域性(使用者定義)變數的作用域限制在一個批處理中,不可在 GO 命令後引用。
USE pubs
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO -- @MyMsg is not valid after this GO ends the batch.

-- Yields an error because @MyMsg not declared in this batch.
PRINT @MyMsg
GO

SELECT @@VERSION;
-- Yields an error: Must be EXEC sp_who if not first statement in 
-- batch.
sp_who
GO
SQL Server 應用程式可將多條 Transact-SQL 語句作為一個批處理髮給 SQL Server 去執行。在此批處理中的語句編譯成一個執行計劃。程式設計師在 SQL Server 實用工具中執行特定語句,或生成 Transact-SQL 語句指令碼在 SQL Server 實用工具中執行,用 GO 來標識批處理的結束。
如果基於 DB-Library、ODBC 或 OLE DB APIs 的應用程式試圖執行 GO 命令時會收到語法錯誤。SQL Server 實用工具永遠不會向伺服器傳送 GO 命令。
許可權
GO 是一個不需許可權的實用工具命令。可以由任何使用者執行。
示例
下面的示例建立兩個批處理。第一個批處理只包含一條 USE pubs 語句,用於設定資料庫上下文。剩下的語句使用了一個區域性變數,因此所有的區域性變數宣告必須在一個批處理中。這一點可通過在最後一條引用此變數的語句之後才使用 GO 命令來做到。
USE pubs
GO
DECLARE @NmbrAuthors int
SELECT @NmbrAuthors = COUNT(*)
FROM authors
PRINT 'The number of authors as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrAuthors AS char (10))
GO


--------------------------------------------------------

EXECUTE
執行標量值的使用者定義函式、系統過程、使用者定義儲存過程或擴充套件儲存過程。同時支援 Transact-SQL 批處理內的字串的執行 

語法
執行儲存過程:
[ [ EXEC [ UTE ] ]
    { 
        [ @return_status = ]
            { procedure_name [ ;number ] | @procedure_name_var
    } 
    [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ]
        [ ,...n ] 
[ WITH RECOMPILE ] 
執行字串:
EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )
引數
@return_status
是一個可選的整型變數,儲存儲存過程的返回狀態。這個變數在用於 EXECUTE 語句前,必須在批處理、儲存過程或函式中宣告過。
在用於喚醒呼叫標量值使用者定義函式時,@return_status 變數可以是任何標量資料型別。
procedure_name
是擬呼叫的儲存過程的完全合法或者不完全合法的名稱。過程名稱必須符合識別符號規則。有關更多資訊,請參見使用識別符號。無論伺服器的內碼表或排序方式如何,擴充套件儲存過程的名稱總是區分大小寫。 
使用者可以執行在另一資料庫中建立的過程,只要該使用者擁有此過程或有在該資料庫中執行它的適當的許可權。使用者可以在另一臺執行 Microsoft® SQL Server™ 的伺服器上執行過程,只要該使用者有適當的許可權使用該伺服器(遠端訪問),並能在資料庫中執行該過程。如果指定了伺服器名稱但沒有指定資料庫名稱,SQL Server 會在使用者預設的資料庫中尋找該過程。
;number
是可選的整數,用於將相同名稱的過程進行組合,使得它們可以用一句 DROP PROCEDURE 語句除去。該引數不能用於擴充套件儲存過程。
在同一應用程式中使用的過程一般都以該方式組合。例如,在訂購應用程式中使用的過程可以 orderproc;1、orderproc;2 等來命名。DROP PROCEDURE orderproc 語句將除去整個組。在對過程分組後,不能除去組中的單個過程。例如,DROP PROCEDURE orderproc;2 是不允許的。有關過程組的更多資訊,請參見 CREATE PROCEDURE。 
@procedure_name_var
是區域性定義變數名,代表儲存過程名稱。
@parameter
是過程引數,在 CREATE PROCEDURE 語句中定義。引數名稱前必須加上符號 (@)。在以 @parameter_name = value 格式使用時,引數名稱和常量不一定按照 CREATE PROCEDURE 語句中定義的順序出現。但是,如果有一個引數使用 @parameter_name = value 格式,則其它所有引數都必須使用這種格式。
預設情況下,引數可為空。如果傳遞 NULL 引數值,且該引數用於 CREATE 或 ALTER TABLE 語句中不允許為 NULL 的列(例如,插入至不允許為 NULL 的列),SQL Server 就會報錯。為避免將 NULL 引數值傳遞給不允許為 NULL 的列,可以在過程中新增程式設計邏輯或採用預設值(使用 CREATE 或 ALTER TABLE 語句中的 DEFAULT 關鍵字)。
value
是過程中引數的值。如果引數名稱沒有指定,引數值必須以 CREATE PROCEDURE 語句中定義的順序給出。
如果引數值是一個物件名稱、字串或通過資料庫名稱或所有者名稱進行限制,則整個名稱必須用單引號括起來。如果引數值是一個關鍵字,則該關鍵字必須用雙引號括起來。
如果在 CREATE PROCEDURE 語句中定義了預設值,使用者執行該過程時可以不必指定引數。如果該過程使用了帶 LIKE 關鍵字的引數名稱,則預設值必須是常量,並且可以包含 %、_、[ ] 及 [^] 萬用字元。
預設值也可以為 NULL。通常,過程定義會指定當引數值為 NULL 時應該執行的操作。
@variable
是用來儲存引數或者返回引數的變數。
OUTPUT
指定儲存過程必須返回一個引數。該儲存過程的匹配引數也必須由關鍵字 OUTPUT 建立。使用遊標變數作引數時使用該關鍵字。
如果使用 OUTPUT 引數,目的是在呼叫批處理或過程的其它語句中使用其返回值,則引數值必須作為變數傳遞(即 @parameter = @variable)。如果一個引數在 CREATE PROCEDURE 語句中不是定義為 OUTPUT 引數,則對該引數指定 OUTPUT 的過程不能執行。不能使用 OUTPUT 將常量傳遞給儲存過程;返回引數需要變數名稱。在執行過程之前,必須宣告變數的資料型別並賦值。返回引數可以是 text 或 image 資料型別以外的任意資料型別。
DEFAULT
根據過程的定義,提供引數的預設值。當過程需要的引數值沒有事先定義好的預設值,或缺少引數,或指定了 DEFAULT 關鍵字,就會出錯。
n
是佔位符,表示在它前面的專案可以多次重複執行。例如,EXECUTE 語句可以指定一個或者多個 @parameter、value 或 @variable。
WITH RECOMPILE
強制編譯新的計劃。如果所提供的引數為非典型引數或者資料有很大的改變,使用該選項。在以後的程式執行中使用更改過的計劃。該選項不能用於擴充套件儲存過程。建議儘量少使用該選項,因為它消耗較多系統資源。
@string_variable
是區域性變數的名稱。@string_variable 可以是 char、varchar、nchar 或 nvarchar 資料型別,最大值為伺服器的可用記憶體。如果字串長度超過 4,000 個字元,則把多個區域性變數串聯起來用於 EXECUTE 字串。有關係統提供的 SQL Server 資料型別更多的資訊,請參見資料型別。 
[N]'tsql_string'
是一個常量,tsql_string 可以是 nvarchar 或 varchar 資料型別。如果包含 N,則該字串將解釋為 nvarchar 資料型別,最大值為伺服器的可用記憶體。如果字串長度超過 4,000 個字元,則把多個區域性變數串聯起來用於 EXECUTE 字串。
註釋
如果過程名稱的前三個字元為 sp_,SQL Server 會在 Master 資料庫中尋找該過程。如果沒能找到合法的過程名稱,SQL Server 會尋找所有者名稱為 dbo 的過程。若要將儲存過程名稱解析為與系統儲存過程同名的使用者定義儲存過程,請提供一個完全合法的過程名稱。 
引數可以通過利用 value 或 @parameter_name = value 來提供。引數不是事務的一個部分;因而如果事務中的引數值更改,且該事務在以後回滾,該引數值不會退回到以前的值。返回給呼叫方的值總是過程返回時的值。
當一個儲存過程呼叫另一個儲存過程時,會產生巢狀。當呼叫的過程開始執行時,巢狀級會增加,當呼叫過程執行結束時,巢狀級則會減少。巢狀級最高為32級,超過32級時,會導致整個呼叫過程鏈失敗。當前的巢狀級儲存在 @@NESTLEVEL 函式中。
SQL Server 目前使用返回值 0 到 -14 來表示儲存過程的執行狀態。值 –15 到 -99 留作後用。有關保留的返回狀態值的列表的更多資訊,請參見 RETURN。 
因為遠端儲存過程和擴充套件儲存過程不在事務的作用域中(除非在 BEGIN DISTRIBUTED TRANSACTION 語句中發出或者是和不同的配置選項一起使用),所以通過呼叫執行的命令不能回滾。有關更多資訊,請參見系統儲存過程和 BEGIN DISTRIBUTED TRANSACTION。 
當使用遊標變數時,如果執行的過程傳遞一個分配有遊標的遊標變數,就會出錯。 
在執行儲存過程時,如果語句是批處理中的第一個語句,則不一定要指定 EXECUTE 關鍵字。 
使用帶字串的 EXECUTE 命令
使用字串串聯運算子 (+) 為動態執行建立長字串。每個字串表示式可以是 Unicode 與 non-Unicode 資料型別的混合。
儘管每個 [N] 'tsql_string' 或 @string_variable 不得超過 8,000 個位元組,SQL Server 語法分析器中對這種串聯只進行邏輯處理而不佔用實體記憶體。例如,該語句決不會生成長 16,000 個串聯起來的字串:
EXEC('name_of_8000_char_string' + 'another_name_of_8000_char_string')
在 EXECUTE 語句執行前,不會編譯 EXECUTE 語句內的語句。 
資料庫環境的更改只在 EXECUTE 語句結束前有效。例如,在這個例子的 EXEC 後,資料庫環境是 master:
USE master EXEC ("USE pubs") SELECT * FROM authors
許可權
儲存過程的 EXECUTE 許可權預設給該儲存過程的所有者,該所有者可以將此許可權轉讓給其他使用者。當遇到 EXECUTE 語句時,即使 EXECUTE 語句是在儲存過程中,也會檢查在 EXECUTE 字串內使用該語句的許可權。當執行一個執行字串的儲存過程時,系統會在執行該過程的使用者環境中,而不是在建立該過程的使用者環境中檢查許可權。但是,如果某使用者擁有兩個儲存過程,並且第一個過程呼叫第二個過程,則在第二個過程中不進行 EXECUTE 許可權檢查。
示例
A. 使用 EXECUTE 傳遞單個引數
showind 儲存過程需要引數 (@tabname),它是一個表的名稱。下面這個例子執行 showind 儲存過程,以 titles 為引數值。
 
說明  showind 儲存過程只是用來作為一個例子,pubs 資料庫並沒有此過程。
EXEC showind titles
在執行過程中變數可以顯式命名:
EXEC showind @tabname = titles
如果這是 isql 指令碼或批處理中第一個語句,則 EXEC 語句可以省略:
showind titles
-或-
showind @tabname = titles


--------------------------------------------------------

接分

--------------------------------------------------------

GO
用訊號通知 Microsoft® SQL Server™ 實用工具一批 Transact-SQL 語句的結束。

EXECUTE
執行標量值的使用者定義函式、系統過程、使用者定義儲存過程或擴充套件儲存過程。同時支援 Transact-SQL 批處理內的字串的執行 

若要喚醒呼叫函式,請使用 EXECUTE stored_procedure 中描述的語法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-410789/,如需轉載,請註明出處,否則將追究法律責任。

相關文章