程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> sqlserver 劇本和批處置指令小結

sqlserver 劇本和批處置指令小結

編輯:MSSQL

sqlserver 劇本和批處置指令小結。本站提示廣大學習愛好者:(sqlserver 劇本和批處置指令小結)文章只能為提供參考,不一定能成為您想要的結果。以下是sqlserver 劇本和批處置指令小結正文


一.劇本基本
     1.USE語句
          設置以後數據庫。
     2.聲明變量
          語法:DECLARE @變量名 變量類型
          在聲明變量後,給變量賦值之前,變量的值為NULL。
          將體系函數賦給聲明的變量,這個辦法可使我們能更平安地應用值,該值只要工資地轉變時它才更改。假如直接應用體系函數自己,那末當它產生更改時,有
     時會沒法肯定其畢竟為什麼,由於年夜多半體系函數值是由體系肯定的。這輕易在你不預期的情形下招致體系轉變了值,惹起弗成預期的效果。
          (1).給變量賦值
               SET:當停止變量賦值是,該值曾經曉得是確實值或許是其他變量時,應用SET。
               SELECT:當變量賦值基於一個查詢時,應用SELECT。
          (2).體系函數
               SQL Server 2005中有30多個無參的體系函數,個中一些最主要的以下:
               @@ERROR:                    前往以後銜接下,最初履行的T-SQL語句的毛病代碼,如無毛病前往0。
               @@FETCH_STATUS:       和FETCH語句合營應用。
               @@IDENTITY:                前往最初一句運轉語句的、主動生成的標識值,作為最初INSERT或許SELECT INTO語句的成果。
               @@ROWCOUNT:              前往最初一個語句影響的行數。
               @@SERVERNAME:          前往劇本正在其上運轉的當地辦事的名字。
               @@TRANCOUNT:            前往運動事務的數目,特殊是針對以後銜接的事務的瓶頸水平。

二.批處置
     (1).GO零丁占一行。在統一行上,T-SQL語句不克不及在GO語句之前。
     (2).一切語句從劇本開端處或許上一個GO語句開端編譯,直到下一個GO語句或許劇本停止,將這段代碼編譯到一個履行籌劃中並互相自力地送往辦事器。前一
 個履行籌劃中產生毛病,不會影響後一個履行籌劃。
     (3).GO不是一個T-SQL敕令,只是被編纂對象辨認的敕令。當編纂對象碰著GO,它把GO看作一個停止批處置的標志,將其打包,然後作為一個自力單位發送到
 辦事器——不包含GO,辦事器關於GO沒有任何概念。         
     1.批處置中的毛病
          語法毛病,運轉時毛病。
     2.什麼時候應用批處置
          (1).單獨成批處置的語句
               有幾個敕令必需單獨成批處置,它們包含:
                    CREATE DEFAULT
                    CREATE PROCEDURE
                    CREATE RULE
                    CREATE TRIGGER
                    CREATE VIEW
               假如想將這些語句中的任何一條和其他語句構成零丁的一個劇本,那末須要采取一個GO語句將它們分離斷開,歸入各自的批處置中。
          (2).應用批處置樹立優先級
               應用批處置最靠得住的例子是,當須要斟酌語句履行的優先次序時,也就是說,須要一個義務在另外一個義務開端前履行。
               例如:
                    CREATE DATABASE Test                    

CREATE TABLE TestTable
(
col1 INT,
col2 INT
)

               履行語句,會發明生成的表沒有在Test數據庫中,而是在master數據庫中(假如以後應用的數據庫是體系數據庫)。由於在履行劇本的時刻,應用的數據
          庫是體系數據庫,該數據庫是以後的,所以生成的表在體系數據庫中。看起來,應當在創立表之前指定命據庫Test。但是,如許依然存在成績。解析器試圖校
          驗代碼,發明我們用USE敕令援用的數據庫其實不存在。緣由在於創立數據庫的語句和創立表的語句寫在一個批處置中,在履行該劇本之前,固然數據庫還沒有
          創立。依據批處置的請求,我們將創立數據庫和創立表的劇本用GO語句分為兩個自力的批處置。准確代碼以下:

CREATE DATABASE Test
GO

USE Test
CREATE TABLE TestTable
(
col1 INT,
col2 INT
)

三.靜態SQL:應用EXE敕令生成代碼
     語法:EXEC/EXECUTE ({<字符串變量> | '<字面值敕令字符串>'})
     1.EXEC的感化域
          真實的挪用EXEC語句的行,具有同該EXEC語句正在運轉的批或進程中的其他代碼雷同的感化域。然則作為EXEC語句成果而被履行的代碼,被以為是在它自
     己的批中。
          例如:
          DECLARE @OutVar VARCHAR(50)
          EXEC ('SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
          這裡體系會報錯,指出必需聲明變量@OutVar。由於EXEC的語句單獨成為一個批處置,個中的變量不克不及和其外的感化域相溝通,只在這個批處置中有用。此
     時,@OutVar的值為NULL。准確的寫法以下:
          EXEC ('DECLARE @OutVar VARCHAR(50)
                    SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
          這裡,我們看到兩中分歧的感化域,這兩種感化域間不克不及互相溝通。假如不采取內部機制,好比一個暫時表,我們就沒有方法完成在外部感化域和內部感化域
     之間傳遞信息。有一個破例的工作是可以在EXEC的區域外部湧現,而且也能在EXEC履行後被看到,這就是體系函數。是以,像@@ROWCOUNT如許的變量依然
     可以或許被應用。
     2.平安高低文和EXEC
          當付與或人權力運轉一個存儲進程,意味著他也能取得權力去履行存儲進程外部的舉措。好比,有一個存儲進程用來列出客歲內一切的雇傭員工。個中有權限
     履行該存儲進程的人,能力夠履行並前往成果——即便他沒有權限直接拜訪人力資本的員工表。
          如許隱含權限關於EXEC語句是有效的。在默許情形下,任安在一個EXEC語句外部樹立的參照,都將在以後用戶的平安高低文中運轉。是以,我們有權力去訪
     問一個叫spNewEmployee的存儲進程,然則卻沒有權力去拜訪員工表。假如spNewEmployee經由過程一個簡略的SELECT語句取得值,那末一切正常。然則假如
     pNewEmployee應用EXEC語句去履行一個SELECT語句,這個EXEC語句將掉敗——由於沒有權力拜訪員工表。
     3.用戶自界說函數和EXEC聯系關系
          不克不及在統一個語句中同時運轉一個函數和EXEC語句。例如:
          DECLARE @Num INT
          SET @Num = 3
          EXEC ('SELECT LEFT(LastName, ' + CAST(@Num AS VARCHAR) + ') AS FilingName FROM Contact')
          這個語句會前往一個毛病新聞,由於CAST函數須要在EXEC地點行之前被解析。准確代碼以下:
          DECLARE @Num INT
          DECLARE @str VARCHAR(255)
          SET @Num = 3
          SET @str = 'SELECT LEFT(LastName, ' + CAST(@Num AS VARCHAR) + ') AS FilingName FROM Contact'
          EXEC (@str)
          這個例子任務正常,由於EXEC的輸出值曾經是一個完全的字符串。
     4.EXEC和用戶自界說函數
          普通來講,不許可用戶自界說函數外部應用EXEC去運轉靜態SQL,然則,應用EXEC運轉一個存儲進程,多數情形是正當的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved