丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

7. Transact-SQL程序设计

本章主题

l        使用SQL查询分析器

l        Transact-SQL的组成元素

l        局部变量

l        运算符

l        表达式

l        如何为程序加上注释

l        函数

l        流程控制语句

l        动态创建语句

 

精彩内容不容错过!这一章内容非常重要

 

 

所谓“程序设计”就是学习如何以合理的方式将一系列的命令结合起来。

 

准备工作

准备工作:在示例代码ch8目录中,数据库(NorthwindSQL)

文件名:NorthwindSQL.mdfNorthwindSQL.ldf

 

7.1. 使用SQL查询分析器

 

 

7.2. Transact-SQL的组成元素

SQL语言不具备创建窗体、菜单、报表等的能力,SQL Server扮演一个后台数据库的角色,客户端的开发工具可以选择VBAccessVFPVCDelphiC++Builder等。

 

Transact-SQL的组成元素:

Ø        数据定义语言(Data Definition LanguageDDL

Ø        数据操作语言(Data Manipulation LanguageDML

Ø        数据控制语言(Data Control LanguageDCL

Ø        系统存储过程(System Stored Procedure

Ø        其它组成元素

 

数据定义语言

DDL用来定义和管理数据库及其所含种类对象的语句

DDL的形式:

Ø        CREATE object_name

Ø        ALTER object_name

Ø        DROP object_name

 

数据操作语言

DML用来查询、添加、修改、删除数据库中数据的语句

DML的种类:

Ø        SELECT

Ø        INSERT

Ø        UPDATE

Ø        DELETE

 

数据控制语言

DCL用来设置或更改数据库用户或角色权限的语句

DCL的种类:

Ø        GRANT

Ø        DENY

Ø        REVOKE

 

系统存储过程

系统存储过程存放在系统数据库master中且名称以sp_开头,如sp_addtypesp_renamesp_configure等。回忆一下先前讲过的sp_addtype系统存储过程

 

其它组成元素

Ø        注释

Ø        局部变量

Ø        运算符

Ø        函数

Ø        流程控制语句

 

7.3. 常量

字符串常量

示例:

温一军

处理中,请稍后…’

输入值必须介于3000~10000’

Ø        如果字符串中包含单引号,可以用两个单引号表示字符串本身内嵌的单引号

n        如:’It’’s legs are long’

 

Unicode字符串常量

必须以大定的字母N作为前缀,如:N’Michaё,Unicode数据的每一个字符使用2个字节存储。

 

二进制常量

0x作为前缀,再加上16进制数值来表示。

如:

0xAE

0x12Ef

 

Bit常量

01表示

 

日期时间常量

Ø        日期时间常量可能只包含日期只包含时间或日期时间都有

Ø        在日期部分可采用字母日期格式数字日期格式未分隔字符串格式

Ø        不论采用哪一种格式的日期,年份都可以使用2位或4位的数字。

Ø        时间部分采用时间格式。

Ø        如果只指定日期,时间默认是12:00AM(午夜)

Ø        如果只指定时间,日期默认是190011

 

特别注意:

日期时间常量必须包含在一对单引号中。

最好一致使用4位数的年份

 

数字日期格式:

Ø        在年份、月份、日期之间的分隔符

n        斜线 /

n        连字符

n        英文的句点 .

Ø         示例:

n        ‘2005-3-19’

n        ‘2005/3/19’

n        ‘2005/03/19’

n        ‘2005-3-19’‘2005-03-19’  (可加上前置0

Ø        年份、月份、日的顺序

n        SET DATEFORMAT格式

n        格式:mdydmyymdydmmyddym

/* 档案名称: Demo81.sql */

SET DATEFORMAT ydm

GO

 

DECLARE @datevar datetime

SET @datevar = '2001/21/09'

SELECT @datevar

GO

 

SET DATEFORMAT mdy

GO

 

DECLARE @datevar datetime

SET @datevar = '09/21/2001'

SELECT @datevar

GO

 

SET DATEFORMAT ymd

GO

 

DECLARE @datevar datetime

SET @datevar = '2001/09/21'

SELECT @datevar

GO

 

时间格式:

Ø        格式:Hours[:Minutes[:Seconds][:Milliseconds]]][AM | PM]

Ø        示例:

n        ’14:30:20:559’

n        ‘2:30:20.5 AM’  其中20.5表示20分又十分之5

n        AMPM可大写或小写表示,且与前面时间值之间可空格或不空格

 

敬告大家:

最好统一采用固定一种格式,方便开发、维护、调试!

 

整数常量

不包含小数点,如:

Ø        2991

Ø        1969

Ø        10

 

Decimal常量

可以包含小数点,如:

Ø        256.456

Ø        2

Ø        23.11

 

FloatReal常量

使用科学计数法表示,如:

Ø        101.5E5

Ø        0.5E-2

 

货币值常量

可以包含或不包含小数点,以一货币符号$作为前缀,如:

Ø        $234

Ø        $345.33

 

指定正数或负数

以负号- 表示负数,不加符号,表示正数。

 

常量的使用方式

Ø        常量用于算术表达式

n      SELECT Salary+$500 FROM myTable

Ø        常量作为WHERE子句中的条件值

n      SELECT * FROM myTable WHERE name=’温一军

Ø        将常量赋值给变量

n      SET @datetimevar=’2005-01-01’

Ø        当使用UPDATE命令时,用于SET子句中

n      UPDATE myTable

SET salary=$6000

WHERE birthday=’1970-12-05’

Ø        IF语句或CASE函数等条件语句中

n      IF (@storageAmount<5000)

PRINT ‘低于安全库存

 

7.4. 局部变量

是一个能够拥有特定数据类型的对象,是程序中各数据的临时存储处。

 

声明局部变量

Ø        格式:DECLARE {@local_variable  data_type} […n]

Ø        赋予局部变量一个名称,必须以@符号开头。

Ø        DECLARE命令在创建局部变量之后,会将其初始值设成NULL

 

示例:

Ø      DECLARE @searchName varchar(12)

Ø      DECLARE @birthday datetime

Ø      DECLARE @height decimal(5,2)

Ø      DELCARE @name nvarchar(12),@phone nvarchar(11)

 

赋值数据值

Ø        格式:SET  @local_variable=表达式

/* 档案名称: Demo82.sql */

--声明一个局部变量

DECLARE @mString varchar(40)

 

--将文字串赋值给局部变量

SET @mString = '! 谢谢使用本系统'

 

--显示局部变量所持有的值

SELECT @mString

 

/* 档案名称: Demo83.sql */

--声明一个局部变量

DECLARE @mString nvarchar(40)

 

--将文字串赋值给局部变量

SET @mString = N'! 谢谢使用本系统'

 

--显示局部变量所持有的值

SELECT @mString

 

/* 档案名称: Demo84.sql */

USE NorthwindSQL

 

--声明一个局部变量

DECLARE @NameVariable char(10) 

 

--将文字串常数赋值给局部变量

SET @NameVariable = '许建仁'

 

--将局部变量使用于 SELECT 命令的 WHERE 引数中

SELECT 身份证字号,姓名,电话号码,住址

  FROM 飞狐工作室

  WHERE 姓名 = @NameVariable

 

/* 档案名称: Demo85.sql */

USE NorthwindSQL

 

--声明三个局部变量

DECLARE @LastName char(2),

        @CityVariable char(6),

        @BirthdayVariable datetime

 

--将常数赋值给局部变量

SET @LastName = ''

SET @CityVariable = '台北市'

SET @BirthdayVariable = '9/24/1973'

 

--将局部变量使用于 SELECT 命令的 WHERE 引数中

SELECT 姓名,电话号码,住址,出生日期

  FROM 飞狐工作室

  WHERE 姓名 LIKE @LastName + '%' AND

        住址 LIKE '%'  + @CityVariable + '%' AND

        出生日期 = @BirthdayVariable

 

/* 档案名称: Demo86.sql */

USE NorthwindSQL

 

DECLARE @AvgSalary money

 

--将计算所得之平均薪资储存至局部变量 @AvgSalaryVariable

SELECT @AvgSalary = AVG(目前薪资)

  FROM 飞狐工作室

 

--将局部变量 @AvgSalary 所持有的值显示出来

SELECT @AvgSalary

 

/* 档案名称: Demo87.sql */

USE NorthwindSQL

 

DECLARE @MaxSalary money

 

SELECT @MaxSalary = 目前薪资

  FROM 飞狐工作室

  ORDER BY 目前薪资 ASC

 

--将局部变量 @MaxSalary 所持有的值显示出来

SELECT @MaxSalary

 

适用范围

局部变量只能在声明它们的批处理、存储过程中使用。

/* 档案名称: Demo88.sql */

USE NorthwindSQL

 

DECLARE @VlHere datetime

 

SET @VlHere = '09/26/1967'

GO

 

-- 此时区域性变数 @VlHere 已经不在适用范围之内且已不存在

 

-- 下面这一道SELECT命令叙述之所以会发生错误,系因它

-- 存取已经不存在的区域性变数 @VlHere

 

SELECT * FROM 飞狐工作室

  WHERE 出生日期 = @VlHere

 

table数据类型变量

Ø        table数据类型是SQL Server2000新添加的数据类型,该数据类型不适用于表的字段,仅适用于局部变量。

Ø        table数据类型非常象一个临时表,实际上主要用途是作为多条数据记录的临时存储之处。

衷心建议:

如果允许的话,应该尽可能以table数据类型的变量获得临时表。

 

 

/* 档案名称: Demo872.sql */

USE NorthwindSQL

 

/* 宣告一个名为 @MyTableVariable table 资料型态变数 */

DECLARE @MyTableVariable TABLE

     (

       部门   varchar(10) PRIMARY KEY,

       员工人数  bigint,

       部门最高薪资 money,

       部门最低薪资 money,

       部门平均薪资 money

     )

 

/* 将资料新增至 @MyTableVariable */

INSERT INTO @MyTableVariable

    SELECT 部门,

             COUNT(*) AS 部门员工人数,

             MAX(目前薪资) AS 部门最高薪资,

             MIN(目前薪资) AS 部门最低薪资,

             AVG(目前薪资) AS 部门平均薪资

    FROM 飞狐工作室

    GROUP BY 部门

 

 

/* 列示出 @MyTableVariable 的内容 */

SELECT * FROM @MyTableVariable

 

7.5. 运算符

运算符的类型

Ø        算术运算符

Ø        赋值运算符

Ø        位运算符

Ø        比较运算符

Ø        逻辑运算符

Ø        字符串串联运算符

 

算术运算符

运算

符号

加法

减法

-

乘法

*

除法

/

求模

%

 

/* 档案名称: Demo89.sql */

DECLARE @number1 int

DECLARE @number2 int

DECLARE @number3 decimal(4,2)

 

SET @number1 = 13

SET @number2 = 5

SET @number3 = 3

 

SELECT @number1 + 10

 

SELECT @number2 - 10

 

SELECT @number1 + @number2

 

SELECT @number1 - @number2

 

SELECT @number1 * @number2

 

SELECT @number1 / @number2

 

SELECT @number1 / @number3

 

SELECT (@number1 * @number2) % (@number1 + @number2)

 

/* 档案名称: Demo810.sql */

USE NorthwindSQL

 

SELECT 产品, 库存量 + 已订购量

  FROM 产品资料

  ORDER BY 产品 ASC

 

/* 档案名称: Demo811.sql */

USE NorthwindSQL

 

SELECT 姓名,(目前薪资/起薪 - 1) * 100 AS 调薪幅度百分比

  FROM 飞狐工作室

 

 

/* 档案名称: Demo812.sql */

SET DATEFORMAT mdy

 

DECLARE @vlNow datetime

SET @vlNow = '01/01/1999'

 

SELECT @vlNow + 10  --加上10

 

/* 档案名称: Demo813.sql */

SET DATEFORMAT mdy

 

DECLARE @vlNow datetime

SET @vlNow = '01/01/1999 13:00:00'

 

SELECT @vlNow + 10.55  --加上10天+0.55天,

--结果为'01/12/1999 02:12:00'

 

赋值运算符

Ø        运算符为:  (等号)

/* 档案名称: Demo814.sql */

USE NorthwindSQL

 

DECLARE @Variable1 int

DECLARE @Variable2 money

 

SET @Variable1 = 10

 

SELECT @Variable2 = MIN(目前薪资) FROM 飞狐工作室

 

SELECT @Variable1

SELECT @Variable2

 

/* 档案名称: Demo815.sql 此处用于指定查询结果的字段标题*/

USE Northwind

 

SELECT 员工姓名 = FirstName + ' ' + LastName,

       年龄 = DATEDIFF(year,Birthdate,getdate())

  FROM Employees

 

比较运算符

运算

符号

小于

大于

等于

=

不等于

<> 

不等于

!=

小于等于

<=

大于等于

>=

不小于

!<

不大于

!>

 

/* 档案名称: Demo817.sql */

USE NorthwindSQL

 

DECLARE @vlCity nvarchar(3)

 

SET @vlCity = '台北市'

 

IF (@vlCity <> '')

    SELECT 公司名称,连络人,电话

    FROM 客户

    WHERE 城市 = '台北市'

 

逻辑运算符

运算

符号

与(并且)

AND

或(或者)

OR

非(否定)

NOT

 

/* 档案名称: Demo818.sql */

USE NorthwindSQL

 

SELECT 姓名,性别,电话号码,出生日期

  FROM 飞狐工作室

  WHERE 性别 = 0 AND

        DATEDIFF(year,出生日期,GETDATE()) < 30 AND

        部门 = '资讯部'

 

字符串串联运算符

Ø        运算符为:  (加号)

如:SELECT ‘我是温一军’+’大家好!

 

运算符的优先顺序

优先顺序从高到低:

Ø        +(正号)、-(负号)、~

Ø        */$

Ø        +(加)、+(字符串串联)、-(减号)

Ø        关系运算符

Ø        ^(按位异或)、&(按位与)、|(按位或)

Ø        NOT

Ø        AND

Ø        ALL       ANY  BETWEEN  IN   LIKE   OR  SOME

Ø        赋值运算符

一个众所周知的小技巧:

使用小括号可以改变运算的优先顺序。

 

7.6. 表达式

一个表达式可以是一个或一个以上的字段、函数、运算符、局部变量、常量、子查询的组合。

 

7.7. 如何为程序加上注释

单行注释与行内注释

--档案名称: Demo824.sql

--撰写人:温一军

--日期:08/24/99

 

--设定作用资料库

USE NorthwindSQL

 

--列出资讯部的员工资料

SELECT * FROM 飞狐工作室 WHERE 部门 = '资讯部'

 

--档案名称: Demo825.sql

--设定作用资料库

USE NorthwindSQL

 

--列出资讯部的员工资料

SELECT 姓名,

       电话号码,

         部门,

       年龄 = DATEDIFF(year,出生日期,GETDATE())

--此运算式能计算出年龄

  FROM 飞狐工作室

              --不列出财务部的员工资料

  WHERE 部门 <> '财务部'

  ORDER BY 3 DESC --按照年龄高低来排序

 

段落注释

/*

档案名称: Demo826.sql

系统属性: Database Web

撰写人: 温一军

日期: 08/24/99

*/

 

/* 设定作用资料库 */

USE NorthwindSQL

 

/* 列出资讯部的员工资料 */

SELECT * FROM 飞狐工作室 WHERE 部门 = '资讯部'

 

7.8. 函数

Ø        函数(Function)被用来执行一些特殊的运算。

Ø        每一函数包含一个名称,而在名称之后的是一对小括号。如GETDATE( )

Ø        大部分的函数在小括号中需要一个或一个以上的参数。

一个狠恰当的比喻

一个函数象一个自动售货机,机身象是函数本身,投币口是函数的一对小括号,投入到自动售货机的钱币就是传递给函数的参数,从自动售货机吐出的饮料是函数的返回值。

 

字符串函数

Ø        LEN( )

格式:LEN(字符串)

用途:取得字符串的长度(先除去字符串尾部的空格),如果是空字符串,则返回零。

/* 档案名称: Demo831.sql */

SELECT LEN('我叫ALEX')

 

SELECT LEN('我叫ALEX      ')

 

SELECT LEN('')

 

DECLARE @vlString1 nvarchar(10)

DECLARE @vlString2 nvarchar(16)

SET @vlString1 = '我是温一军'

SET @vlString2 = 'My name is Alex.        '

 

SELECT LEN(@vlString1 + @vlString2)

 

Ø        SUBSTRING( )

格式:SUBSTRING(字符串,开始位置,长度)

用途:从指定的字符串的开始位置开始,获取指定长度的字符串。

/* 档案名称: Demo828.sql */

USE NorthwindSQL

 

--建立一个资料表

CREATE TABLE DemoTable

(

uid int IDENTITY(1,1),

content ntext

)

 

--新增资料记录至资料表

INSERT INTO DemoTable

  (content)

  VALUES(N'ABC我是ALEX章立民')

INSERT INTO DemoTable

  (content)

  VALUES(N'123我爱Internet')

 

SELECT uid,SUBSTRING(content,3,5)

  FROM DemoTable

--返回:

--C我是AL

--3我爱IN

DROP TABLE DemoTable

 

/* 档案名称: Demo829.sql */

USE NorthwindSQL

 

--建立一个资料表

CREATE TABLE DemoTable

(

uid int IDENTITY(1,1),

content text

)

 

--新增资料记录至资料表

INSERT INTO DemoTable

  (content)

  VALUES('ABC我是ALEX章立民')

INSERT INTO DemoTable

  (content)

  VALUES('123我爱Internet')

 

SELECT uid,SUBSTRING(content,3,5)

  FROM DemoTable

--返回:

--C我是

--3我爱

DROP TABLE DemoTable

 

此处省略了一些常用函数的介绍

 

无参数函数

特点:

Ø        名称以@@开头

Ø        不需要任何参数,函数名之后不需要加上一对小括号

如:@@ROWCOUNT

从形式上看,象一个变量,在7.0版之前,称之为全局变量,从7.0版开始,称之为函数,常用它来取得一些系统信息。

/* 档案名称: Demo853.sql */

 

USE NorthwindSQL

 

SELECT * FROM 飞狐工作室

 

SELECT '查询的资料笔数: ',@@ROWCOUNT

 

UPDATE 飞狐工作室 SET 姓名 = '章立民' WHERE 身份证字号 = 'Z00990000'

 

SELECT '姓名被修改的资料笔数: ',@@ROWCOUNT

 

7.9. 流程控制语句

BEGIN…END

用于将多个SQL语句组合成一个语句块,该语句块可视为一个整体处理。

/* 档案名称: Demo854.sql */

USE NorthwindSQL

 

Declare @Today int

SET @Today = DAY(GETDATE())

 

IF (@Today = 1) --如果今天是本月 1

   BEGIN

     PRINT '今天将举办庆生会,本月寿星如下:'

     SELECT 姓名,出生日期

       FROM 飞狐工作室

       WHERE MONTH(出生日期) = MONTH(GETDATE())

   END

 

/* 档案名称: Demo855.sql */

USE NorthwindSQL

 

IF (SELECT COUNT(*) FROM 飞狐工作室 WHERE 性别 = 1) > 0

   BEGIN

     PRINT '男性员工的平均薪资:'

     PRINT ''

    SELECT AVG(目前薪资) FROM 飞狐工作室 WHERE 性别 = 1

     IF (SELECT COUNT(*) FROM 飞狐工作室

           WHERE 性别 = 1 AND 婚姻状况 = 1) > 0

        BEGIN

          PRINT '已婚之男性员工的平均薪资:'

          PRINT ''

          SELECT AVG(目前薪资) FROM 飞狐工作室

            WHERE 性别 = 1 AND 婚姻状况 = 1

        END

   END

 

循环WHILE

Ø        用于重复多次执行某项工作

Ø        可用CONTINUE使程序直接跳回WHILE命令行做条件判断

Ø        可用BREAK命令,直接退出所在循环。

Ø        循环可以嵌套

 

/* 档案名称: Demo856.sql */

DECLARE @Number int, @Total int

SET @Number = 0

SET @Total = 0

 

WHILE(@Number < 11)

  BEGIN

    SET @Total = @Total + @Number

    SET @Number = @Number + 1

  END

 

PRINT '1+2+...+10 = '+CAST(@Total AS char(2)

 

/* 档案名称: Demo858.sql */

EXEC sp_dboption 'NorthwindSQL', 'select into/bulkcopy', 'TRUE'

--当为 true 时,允许使用 SELECT INTO 语句进行快速大容量复制。

--select into/bulkcopy 选项设置为真以启用无日志记录的操作

USE NorthwindSQL

 

-- 建立一个新的资料表 TempTable 以利稍后练习之用

SELECT身份证字号,姓名,目前薪资

  INTO TempTable

  FROM 飞狐工作室

 

EXEC sp_dboption 'NorthwindSQL', 'select into/bulkcopy', 'FALSE'

 

PRINT ''

SELECT未加薪前员工的平均薪资 = AVG(目前薪资) FROM TempTable

 

-- 如果平均薪资小于 $70000, 则全体加薪 1.2

WHILE (SELECT AVG(目前薪资) FROM TempTable) < $70000

  BEGIN

    UPDATE TempTable

      SET 目前薪资 = 目前薪资 * 1.2

     SELECT 最高薪 = MAX(目前薪资) FROM TempTable

 

    -- 如果最高薪大于 $150000 ,则不再全体加薪

    IF (SELECT MAX(目前薪资) FROM TempTable) > $150000

        BREAK

    ELSE

        CONTINUE

  END

 

PRINT ''

SELECT 全体加薪后员工的平均薪资 = AVG(目前薪资) FROM TempTable

 

-- 将练习用的资料表 TempTable 删除

DROP TABLE TempTable

 

条件语句IF…ELSE

该语句使程序能够有不同的条件分支,从而完成在不同的条件下执行不同的操作。

 

/* 档案名称: Demo859.sql */

USE NorthwindSQL

 

-- 先检查名称为 MyDemoTable 的使用者资料表是否存在

IF EXISTS (SELECT * FROM sysobjects

             WHERE type = 'U' AND name = 'MyDemoTable')

   DROP TABLE MyDemoTable

 

CREATE TABLE MyDemoTable

(

代码 int NOT NULL IDENTITY(1,1),

姓名 nvarchar(20) NOT NULL

)

 

/* 档案名称: Demo860.sql */

USE NorthwindSQL

 

DECLARE @Name varchar(10),

        @Sex bit,

        @Married bit,

        @Phone char(10),

        @ChineseSex char(2),

        @ChineseMarried char(4)

 

DECLARE Studio_Cursor CURSOR FOR  //声明一个游标

  SELECT 姓名, 性别, 婚姻状况, 电话号码 FROM 飞狐工作室

 

OPEN Studio_Cursor  //有关游标操作,以后讲解

 

FETCH NEXT FROM Studio_Cursor  //取下一行值

  INTO @Name, @Sex, @Married, @Phone

 

-- 检查 @@FETCH_STATUS 之值以便决定是否

-- 要继续执行回圈以便提取更多的资料记录

WHILE @@FETCH_STATUS = 0

BEGIN

    PRINT '员工姓名: ' + @Name

    IF (@Sex = 1)

       SET @ChineseSex = ''

    ELSE

       SET @ChineseSex = ''

    IF (@Married = 1)

       SET @ChineseMarried = '已婚'

    ELSE

SET @ChineseMarried = '未婚'

 

    PRINT '   : ' + @ChineseSex

    PRINT '婚姻状况: ' + @ChineseMarried

    PRINT '电话号码: ' + @Phone

    PRINT REPLICATE('-',30)

 

    FETCH NEXT FROM Studio_Cursor

      INTO @Name, @Sex, @Married, @Phone

END

 

CLOSE Studio_Cursor

 

DEALLOCATE Studio_Cursor   //释放游标

 

/* 档案名称: Demo861.sql */

USE NorthwindSQL

DECLARE @msg varchar(255)

 

IF (SELECT COUNT(*) FROM 飞狐工作室

  WHERE 姓名 LIKE '%' AND 目前薪资 BETWEEN 15000 AND 20000) > 0

BEGIN

     SET NOCOUNT ON

     SET @msg = '有一些 '''' 姓员工的薪资介于 15000 20000。这些员工是:'

     PRINT @msg

     PRINT REPLICATE('-',40)

 

     SELECT 姓名,目前薪资 FROM 飞狐工作室

       WHERE 姓名 LIKE '%' AND 目前薪资 BETWEEN 15000 AND 20000

END

ELSE

BEGIN

SET @msg = '没有任何 '''' 姓员工的薪资介于 15000 20000'

     PRINT @msg

END

 

/* 档案名称: Demo862.sql */

USE NorthwindSQL

 

DECLARE @Name varchar(10),

        @Salary money,

        @Comment varchar(20)

 

DECLARE Studio_Cursor CURSOR  FOR

  SELECT 姓名, 目前薪资 FROM飞狐工作室

 

OPEN Studio_Cursor

 

FETCH NEXT FROM Studio_Cursor

  INTO @Name, @Salary

 

-- 检查 @@FETCH_STATUS 之值以便决定是否

-- 要继续执行回圈以便提取更多的资料记录

WHILE @@FETCH_STATUS = 0

  BEGIN

    PRINT '员工姓名: ' + @Name

    PRINT '目前薪资: ' + CONVERT(varchar(10),@Salary,1)

 

    IF (@Salary >= 60000)

        SET @Comment = '哇塞!!超越巅峰耶..'

    ELSE

        IF (@Salary >= 50000)

           SET @Comment = '领先群雄耶...'

        ELSE

           IF (@Salary >= 40000)

              SET @Comment = '还过得去啦!!'

           ELSE

              IF (@Salary >= 20000)

                 SET @Comment = '剃刀编缘!!'

              ELSE

                 SET @Comment = '准备卷铺盖吧!!'

 

    PRINT '薪资评比: ' + @Comment

    PRINT REPLICATE('-',30)

 

    FETCH NEXT FROM Studio_Cursor

      INTO @Name, @Salary

 

  END

 

CLOSE Studio_Cursor

 

DEALLOCATE Studio_Cursor

 

CASE函数

 

Ø        简单CASE函数

/* 档案名称: Demo863.sql */

DECLARE @nType int

SET @nType = 1

 

SELECT CASE @nType

         WHEN 1 THEN '资讯部'

         WHEN 2 THEN '生产制造部'

         WHEN 3 THEN '会计部'

         WHEN 4 THEN '业务部'

         ELSE '设立中...'

END

 

/* 档案名称: Demo864.sql */

USE NorthwindSQL

SELECT 姓名,

性别 = CASE 性别

              WHEN 0 THEN ''

              WHEN 1 THEN ''

         END,

         婚姻 = CASE 婚姻状况

                    WHEN 0 THEN '未婚'

                    WHEN 1 THEN '已婚'

                 END,

          电话号码,住址

  FROM 飞狐工作室

 

/* 档案名称: Demo865.sql */

USE pubs

SELECT 姓名 = au_fname + ' ' + au_lname,

       州名 = CASE state  //蓝色字指定列标题文字

                WHEN 'CA' THEN 'California'

                WHEN 'KS' THEN 'Kansas'

                WHEN 'TN' THEN 'Tennessee'

                WHEN 'OR' THEN 'Oregon'

                WHEN 'MI' THEN 'Michigan'

                WHEN 'IN' THEN 'Indiana'

                WHEN 'MD' THEN 'Maryland'

                WHEN 'UT' THEN 'Utah'

             END

FROM authors

ORDER BY au_lname

 

Ø        搜索CASE函数

/* 档案名称: Demo866.sql   给各等级的薪资一个评语*/

USE NorthwindSQL

 

SELECT 姓名,

       目前薪资,

       评价 = CASE

               WHEN (目前薪资 >= 60000) THEN '哇塞!!超越巅峰耶..'

               WHEN (目前薪资 >= 50000) THEN '领先群雄耶...'

               WHEN (目前薪资 >= 40000) THEN '还过得去啦!!'

               WHEN (目前薪资 >= 20000) THEN '剃刀编缘!!'

               ELSE '准备卷铺盖吧!!'

             END

  FROM 飞狐工作室

 

/* 档案名称: Demo867.sql  计算出不同的等级的薪资应该缴纳的税额*/

USE NorthwindSQL

 

SELECT 姓名,

       目前薪资,

       应缴税额 =目前薪资 * CASE

                      WHEN (目前薪资 >= 60000) THEN 0.35

                      WHEN (目前薪资 >= 50000) THEN 0.25

                      WHEN (目前薪资 >= 40000) THEN 0.2

                      WHEN (目前薪资 >= 20000) THEN 0.15

                      ELSE 0.01

                    END

  FROM 飞狐工作室 ORDER BY 目前薪资 DESC

 

RETURN命令

Return命令能够无条件地终止一个查询、存储过程或批处理,在存储过程中,可以使用return将数据返回给调用调用者。

/* 档案名称: Demo870.sql  定义一个存储过程,返回三个数的积*/

USE NorthwindSQL

GO

 

CREATE PROCEDURE MultipleTwoValue @Number1 int,

                                    @Number2 int,

                                    @Number3 int

AS

RETURN @Number1 * @Number2 * @Number3

 

/* 档案名称: Demo871.sql */

USE NorthwindSQL

DECLARE @CountResult int

 

//调用存储过程,取得返回值

EXECUTE @CountResult = MultipleTwoValue 19,34,39

//显示该返回值

SELECT '19 34 39 = ',@CountResult

 

7章 结束

 

posted on 2007-07-21 18:35  丁保国  阅读(648)  评论(0编辑  收藏  举报