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/
