create view必须是批处理中仅有的语句_sqlserver 脚本和批处理指令小结
一.腳本底子
1.USE語(yǔ)句
設(shè)置當(dāng)前數(shù)據(jù)庫(kù)
2.聲明變量
語(yǔ)法:DECLARE @變量名 變量范例
在聲明變量后,給變量賦值之前,變量的值為NULL.
將系統(tǒng)函數(shù)賦給聲明的變量,這個(gè)辦法可以使我們能更安全地利用值,該值只有人為地改變時(shí)它才變更.假如直接利用系統(tǒng)函數(shù)本身,那么當(dāng)它發(fā)生變更時(shí),有
時(shí)會(huì)無(wú)法肯定其畢竟為什么,因?yàn)榇蟠蠖枷到y(tǒng)函數(shù)值是由系統(tǒng)肯定的.這簡(jiǎn)單在你不預(yù)期的情形下招致系統(tǒng)改變了值,惹起不可預(yù)期的后果.
(1).給變量賦值
SET:當(dāng)舉行變量賦值是,該值已經(jīng)知道是切當(dāng)值大概是其他變量時(shí),利用SET.
SELECT:當(dāng)變量賦值基于一個(gè)查詢時(shí),利用SELECT.
(2).系統(tǒng)函數(shù)
SQL Server 2005中有30多個(gè)無(wú)參的系統(tǒng)函數(shù),此中一些最重要的以下:
@@ERROR: 返回當(dāng)前銜接下,最后履行的T-SQL語(yǔ)句的錯(cuò)誤代碼,如無(wú)錯(cuò)誤返回0.
@@FETCH_STATUS: 和FETCH語(yǔ)句配合利用.
@@IDENTITY: 返回最后一句運(yùn)行語(yǔ)句的、自動(dòng)生成的標(biāo)識(shí)值,作為最后INSERT大概SELECT INTO語(yǔ)句的后果.
@@ROWCOUNT: 返回最后一個(gè)語(yǔ)句影響的行數(shù).
@@SERVERNAME: 返回腳本正在其上運(yùn)行的本地服務(wù)的名字.
@@TRANCOUNT: 返回活動(dòng)事件的數(shù)目,分外是針對(duì)當(dāng)前銜接的事件的瓶頸程度.
二.批處理
(1).GO單獨(dú)占一行.在同一行上,T-SQL語(yǔ)句不能在GO語(yǔ)句之前.
(2).全部語(yǔ)句從腳本開(kāi)始處大概上一個(gè)GO語(yǔ)句開(kāi)始編譯,直到下一個(gè)GO語(yǔ)句大概腳本完畢,將這段代碼編譯到一個(gè)履行籌劃中并彼此獨(dú)立地送往服務(wù)器.前一
個(gè)履行籌劃中發(fā)生錯(cuò)誤,不會(huì)影響后一個(gè)履行籌劃.
(3).GO不是一個(gè)T-SQL號(hào)令,只是被編輯工具辨認(rèn)的號(hào)令.當(dāng)編輯工具碰到GO,它把GO看做一個(gè)完畢批處理的標(biāo)志,將其打包,然后作為一個(gè)獨(dú)立單元發(fā)送到
服務(wù)器——不包含GO,服務(wù)器關(guān)于GO沒(méi)有任何概念.
1.批處理中的錯(cuò)誤
語(yǔ)法錯(cuò)誤,運(yùn)行時(shí)錯(cuò)誤.
2.什么時(shí)刻利用批處理
(1).單獨(dú)成批處理的語(yǔ)句
有幾個(gè)號(hào)令必須單獨(dú)成批處理,它們包含:
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
CREATE TRIGGER
CREATE VIEW
假如想將這些語(yǔ)句中的任何一條和其他語(yǔ)句構(gòu)成單獨(dú)的一個(gè)腳本,那么需求采取一個(gè)GO語(yǔ)句將它們辨別斷開(kāi),歸入各自的批處理中.
(2).利用批處理成立優(yōu)先級(jí)
利用批處理最堅(jiān)固的例子是,當(dāng)需求考慮語(yǔ)句履行的優(yōu)先次序時(shí),也就是說(shuō),需求一個(gè)任務(wù)在另一個(gè)任務(wù)開(kāi)始前履行.
比方:
CREATE DATABASE Test
復(fù)制代碼 代碼以下:
CREATE TABLE TestTable
(
col1 INT,
col2 INT
)
履行語(yǔ)句,會(huì)發(fā)現(xiàn)生成的表沒(méi)有在Test數(shù)據(jù)庫(kù)中,而是在master數(shù)據(jù)庫(kù)中(假如當(dāng)前利用的數(shù)據(jù)庫(kù)是系統(tǒng)數(shù)據(jù)庫(kù)).因?yàn)樵诼男心_本的時(shí)刻,利用的數(shù)據(jù)
庫(kù)是系統(tǒng)數(shù)據(jù)庫(kù),該數(shù)據(jù)庫(kù)是當(dāng)前的,所以生成的表在系統(tǒng)數(shù)據(jù)庫(kù)中.看起來(lái),應(yīng)當(dāng)在成立表之前指定數(shù)據(jù)庫(kù)Test.但是,這樣仍舊存在問(wèn)題.解析器試圖校
驗(yàn)代碼,發(fā)現(xiàn)我們用USE號(hào)令引用的數(shù)據(jù)庫(kù)并不存在.緣由在于成立數(shù)據(jù)庫(kù)的語(yǔ)句和成立表的語(yǔ)句寫在一個(gè)批處理中,在履行該腳本之前,當(dāng)然數(shù)據(jù)庫(kù)還沒(méi)有
成立.按照批處理的要求,我們將成立數(shù)據(jù)庫(kù)和成立表的腳本用GO語(yǔ)句分為兩個(gè)獨(dú)立的批處理,精確代碼以下:
復(fù)制代碼 代碼以下:
CREATE DATABASE Test
GO
USE Test
CREATE TABLE TestTable
(
col1 INT,
col2 INT
)
三.動(dòng)態(tài)SQL:利用EXE號(hào)令生成代碼
語(yǔ)法:EXEC/EXECUTE ({<字符串變量> | '<字面值號(hào)令字符串>'})
1.EXEC的作用域
真正的調(diào)用EXEC語(yǔ)句的行,擁有同該EXEC語(yǔ)句正在運(yùn)行的批或歷程中的其他代碼相同的作用域.但是作為EXEC語(yǔ)句后果而被履行的代碼,被認(rèn)為是在它自
己的批中.
比方:
DECLARE @OutVar VARCHAR(50)
EXEC ('SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
這里系統(tǒng)會(huì)報(bào)錯(cuò),指出必須聲明變量@OutVar.因?yàn)镋XEC的語(yǔ)句單獨(dú)成為一個(gè)批處理,此中的變量不能和其外的作用域相溝通,只在這個(gè)批處理中有效.此
時(shí),@OutVar的值為NULL.精確的寫法以下:
EXEC ('DECLARE @OutVar VARCHAR(50)
SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
這里,我們看到兩中差別的作用域,這兩種作用域間不能彼此溝通.假如不采取外部機(jī)制,比方一個(gè)暫時(shí)表,我們就沒(méi)有辦法實(shí)目前內(nèi)部作用域和外部作用域
之間傳送信息.有一個(gè)例外的事情是可以在EXEC的區(qū)域內(nèi)部呈現(xiàn),并且也能在EXEC履行后被看到,這就是系統(tǒng)函數(shù).因此,像@@ROWCOUNT這樣的變量仍舊
可以被利用.
2.安全上下文和EXEC
當(dāng)賦予某人權(quán)利運(yùn)行一個(gè)存儲(chǔ)歷程,意味著他也能得到權(quán)利去履行存儲(chǔ)歷程內(nèi)部的行動(dòng).比方,有一個(gè)存儲(chǔ)歷程用來(lái)列出去年內(nèi)全部的雇傭員工.此中有權(quán)限
履行該存儲(chǔ)歷程的人,才可以履行并返回后果——即便他沒(méi)有權(quán)限直接拜候人力資源的員工表.
這樣隱含權(quán)限關(guān)于EXEC語(yǔ)句是無(wú)效的.在默許情形下,任安在一個(gè)EXEC語(yǔ)句內(nèi)部成立的參照,都將在當(dāng)前用戶的安全上下文中運(yùn)行.因此,我們有權(quán)利去訪
問(wèn)一個(gè)叫spNewEmployee的存儲(chǔ)歷程,但是卻沒(méi)有權(quán)利去拜候員工表.假如spNewEmployee通過(guò)一個(gè)簡(jiǎn)單的SELECT語(yǔ)句得到值,那么一切正常.但是假如
pNewEmployee利用EXEC語(yǔ)句去履行一個(gè)SELECT語(yǔ)句,這個(gè)EXEC語(yǔ)句將失利——因?yàn)闆](méi)有權(quán)利拜候員工表.
3.用戶自定義函數(shù)和EXEC關(guān)聯(lián)
不能在同一個(gè)語(yǔ)句中同時(shí)運(yùn)行一個(gè)函數(shù)和EXEC語(yǔ)句.比方:
DECLARE @Num INT
SET @Num = 3
EXEC ('SELECT LEFT(LastName, ' + CAST(@Num AS VARCHAR) + ') AS FilingName FROM Contact')
這個(gè)語(yǔ)句會(huì)返回一個(gè)錯(cuò)誤消息,因?yàn)镃AST函數(shù)需求在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)
這個(gè)例子工作正常,因?yàn)镋XEC的輸入值已經(jīng)是一個(gè)完好的字符串.
4.EXEC和用戶自定義函數(shù)
普通來(lái)說(shuō),不答應(yīng)用戶自定義函數(shù)內(nèi)部利用EXEC去運(yùn)行動(dòng)態(tài)SQL,但是,利用EXEC運(yùn)行一個(gè)存儲(chǔ)歷程,少數(shù)情形是合理的.
總結(jié)
以上是生活随笔為你收集整理的create view必须是批处理中仅有的语句_sqlserver 脚本和批处理指令小结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何在柱状图中点连线_练瑜伽,如何放松僵
- 下一篇: uo和o的区别和用法_汉语拼音中,o与u