MSSQLSERVER數據庫- 變量和批處理


        當作學習總結吧!以下的內容很早以前就有人寫過。但我還是要再寫一下,一是練一下自己寫這方面文章的能力,二是對知識點的學習有一下重溫和加深。
        SQL語言也跟其他編程語言一樣,擁有變量、分支、循環等控制語句。之前我不清楚應該把這些歸到哪個名詞上,直到前晚我看到有篇文章是在講SQL語句批處理,所有我就把SQL里的變量、分支、循環等控制語句歸到批處理來。在SQL語言里面把變量分為局部變量和全局變量,全局變量又稱系統變量。
 
先來看一下局部變量:
        局部變量使用declare關鍵字給變量聲明,語法非常簡單:declare @<變量名> <變量類型> [,@<變量名> <變量類型> [.. ]]
        從上面的[,@<變量名> <變量類型> [.. ]]這里我們可以看出他能一次聲明多個變量,變量聲明后但未賦值前,其值為NULL。對變量的賦值可以使用 set關鍵字,使用set關鍵字時對變量的賦值一次只能賦值一個。
         來看一個實例:
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

      WHEN VALUE1 THEN RETURNVALUE1
      WHEN VALUE2 THEN RETURNVALUE2
     ELSE DEFAULTRETURN VALUE
   END
  我們通過一下SQL代碼例子來加深一下加CASE...END的理解:
--查找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] 

  

WAITFOR語句 WAITFOR語句表示時間等待,語法如下: WAITFOR DELAY <’time’> | TIME <’time’>
DELAY參數指定等待的時間量,不能指定天數,只能指定小時,分鍾,秒。最大的延遲時間是24小時,
例如:
WAITFORDELAY '00:01'
select * from Score

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/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM