declare @name nvarchar(50),@age int print @name; print @age; print '----------------'; set @name='Jack' set @age=18 print @name; print @age; print '----------------'; --結果顯示: ---------------- Jack 18 ----------------
可以看到在沒有賦值前,他輸出的是NULL。使用set關鍵字對變量的賦值一次只能賦值一個,那么怎么對多個變量進行賦值?這時可以使用select關鍵字
declare @name nvarchar(50),@age int select @name='Jack',@age=18 print @name; print @age; print '----------------';
我們也可以在查詢語句里面對這個變量進行賦值例如: select @name=sName from student where sid=1;
SQL Server有30多個全局系統變量,但有幾個是常用到的,如下SQL語句
select @@VERSION --查看版本號 select @@IDENTITY; --返回最后插入的標識值--例如 USE MySchool create table ideTest ( id int identity(1,1) primary key, idename nvarchar(50), ) insert into ideTest(idename) values('test1'); insert into ideTest(idename) values('test2'); insert into ideTest(idename) values('test3'); insert into ideTest(idename) values('test4'); insert into ideTest(idename) values('test5'); insert into ideTest(idename) values('test6') select @@IDENTITY; select @@error --返回錯誤編號,當上一條SQL語句的錯誤,我猜想當他的值大於時候,表示有錯誤。沒有錯誤那么用表示 select @@LANGUAGE; --返回版本的語言 select @@SERVERNAME --返回服務器的名稱 select @@ROWCOUNT --返回上一個語句所受影響的行數 --例如結果顯示 delete ideTest where id<=3 select @@ROWCOUNT
SQL語句里的腳本
腳本提供了變量、分支、循環等控制語句,可以用來實現一些復雜的任務,SQL語句里的流程控制語句包括:
- IF…ELSE
- GOTO
- WHILE
- WAITFOR
- TRY/CATCH
- CASE
1、我們先來看一下IF...ELSE語句,語法的格式如下:
IF<Boolean Expression><SQL statement>|
BEGIN<code series>
END[ELSE<SQL statement> |
BEGIN <code series>
END]
注意,使用代碼行時,別忘了BEGIN與END,這里的BENGIN...END 相當於C語言里的{ } 另外,對於IF判斷有一個陷阱,就是 if @var = NULL.這樣子寫法是不對的,因為NULL不等於任何東西,甚至也不等於NULL,應該寫成: if @var IS NULL。我們來看一下具體的實例:
USE MySchool CREATE TABLE Score ( id int identity(1,1) primary key, sname nvarchar(50), english int, math int, computer int ) insert into Score(sname, english, math, computer) values('Jack',50,60,90); insert into Score(sname, english, math, computer) values('Lou',70,80,100); insert into Score(sname, english, math, computer) values('Andy',72,77,66); insert into Score(sname, english, math, computer) values('Am',42,60,55); insert into Score(sname, english, math, computer) values('Jobs',34,61,44); insert into Score(sname, english, math, computer) values('Bill',54,32,76); insert into Score(sname, english, math, computer) values('Afs',47,43,72); --查看英語成績,當英語的平均成績小於分時最低的三個人的成績,當成績大於分取高的三個人的成績 declare @avg float select @avg=avg(english) from Score IF (@avg<60) begin select top 3 * from Score order by english asc end ELSE begin select top 3 * from Score order by english desc end
在SQL里是沒有if...elseif...else的,那么該怎么實現類型於if...elseif...else的作用呢? 可以下面這個例子
USE MySchool CREATE TABLE Score ( id int identity(1,1) primary key, sname nvarchar(50), english int, math int, computer int ) insert into Score(sname, english, math, computer) values('Jack',60,60,90); insert into Score(sname, english, math, computer) values('Lou',70,80,100); insert into Score(sname, english, math, computer) values('Andy',72,77,66); insert into Score(sname, english, math, computer) values('Am',82,60,55); insert into Score(sname, english, math, computer) values('Jobs',64,61,44); insert into Score(sname, english, math, computer) values('Bill',74,32,76); insert into Score(sname, english, math, computer) values('Afs',67,43,72); declare @avg float select @avg=english from Score IF (@avg<60) begin select top 3 * from Score order by english asc end else begin if(@avg>60 and @avg<70) begin select * from Score where english>60 order by english end else begin select top 3 * from Score order by english desc end end
2、While語句
看一下下面這個例子:
declare @i int set @i=0 WHILE(@i<1000) begin set @i=@i+1 insert into Score(sname,english,math,computer) values('test' + CONVERT(nvarchar(10),@i),@i%60,@i%60,@i%60) end 做一個練習,如果不及格的人數超過半數,則給每個人增加2分。 select @count = count(*) from score select @failCount = count(*) from score where english < 60 while(@failCount > @count/2) begin update score set english = english + 2 --為了跳出循環,加了一次后,再過行檢測看人數是否還達到超過一半了 --set @failCount=-1 select @failCount=count(*) from score where english < 60 end
3.CASE...END
case...end的語法格式如下:
CASE EXPRESSION
--查找STUDENT表,當年齡是19歲時顯示青年,18歲顯示小伙,其他年齡顯示少年 SELECT SAGE, CASE SAGE WHEN '19' THEN '青年' WHEN '18' THEN '小伙' ELSE '少年' END FROM student --CASE..END的用處很多,我們可以使用他在客戶等級,管理員級別的時候用到。例如當客戶等級值為1表示普通用戶,當客戶等級用2表示VIP用戶 --其中一個CASE可以產生一個列,多個CASE就會產生多個列 --舉一個蹤合列子,顯示員工姓名/年齡/工資 --工資級別在1-5K 那么初級,工資級別在5-10K 那么中級,工級級別在10K以上 那么是高級。 select fname,fage, ( case fsalary WHEN fsalary>1000 and fsalary<=5000 then '初級' WHEN fsalary>5000 and fsalary<=10000 then '中級' WHEN fsalary>10000 then '高級' else '未分級' ) as '工資級別' from table --有兩張表如下,如何用SQL語句實現第二張表來顯示第一張表的內容 --第一張表: name subject result 張三 語文 80 張三 數學 90 張三 英語 100 李四 語文 77 李四 數學 88 李四 英語 99 --第二張表: name 語文 數學 英語 李四 77 88 99 張三 80 90 100 --SQL語句如下 select [name] sum(case subject when '語文' then result end) as '語文' sum(case subject when '數學' then result end) as '數學' sum(case subject when '英語' then result end) as '英語' group by [name]
DELAY參數指定等待的時間量,不能指定天數,只能指定小時,分鍾,秒。最大的延遲時間是24小時,
TIME參數指定等到一天中某個特定時刻。同樣也只能用24小時制: WAITFOR TIME ‘01:00’; 等到今天01:00時刻執行下面的語句
最后推薦兩篇參考博文:
http://www.cnblogs.com/30ErLi/archive/2010/09/17/1829274.html
這篇文章有些是從這里COPY過來的。還有一篇在批處理上用到的關於SQLCMD的文章:
http://blog.163.com/llsh2010@126/blog/static/1691895692011615113838734/