1. 局部变量
例3-26 创建一个@myvar 变量,然后将一个字符串值放在变量中,最后输出 @myvar 变量的值。
程序清单如下:
DECLARE @myvar char(20)
select @myvar = 'This is a test'
SELECT @myvar
GO
例3-27 通过查询给变量赋值。
程序清单如下:
USE adventureworks
GO
DECLARE @rows int
SET @rows = (SELECT COUNT(*) FROM humanresources.employee)
1. 行集函数
行集函数可以在Transact-SQL语句中当作表引用。
例3-33 通过行集函数OPENQUERY()执行一个分布式查询,以便从服务器local中提取表department中的记录。
程序清单如下:
select * from openquery(local,’select * from department’)
2. 聚合函数(AVG,SUM.COUNT)
聚合函数用于对一组值进行计算并返回一个单一的值。除COUNT 函数之外,聚合函数忽略空值。聚合函数经常与 SELECT 语句的 GROUP BY 子句一同使用。仅在下列项中聚合函数允许作为表达式使用:SELECT 语句的选择列表(子查询或外部查询);COMPUTE 或 COMPUTE BY 子句;HAVING 子句。
例
计算 Adventure Works Cycles 的副总所用的平均休假小时数以及总的病假小时数。对检索到的所有行,每个聚合函数都生成一个单独的汇总值。
程序清单如下。 http://zcz123.iyunv.com/Images/OutliningIndicators/ContractedBlock.gifhttp://zcz123.iyunv.com/Images/OutliningIndicators/ExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->USE AdventureWorks;
GO
SELECT AVG(VacationHours)as 'Average vacation hours',
SUM (SickLeaveHours) as 'Total sick leave hours'
FROM HumanResources.Employee
WHERE Title LIKE 'Vice President%'
LTRIM
例3-38 使用 LTRIM 函数删除字符变量中的起始空格。
程序清单如下:
DECLARE @string_to_trim varchar(60)
SET @string_to_trim = ' Five spaces are at the beginning of this string.'
SELECT 'Here is the string without the leading spaces: ' +
LTRIM(@string_to_trim)
CHARINDEX
例3-39 使用可选的start_location参数从addressline1列的第2个字符开始查找“shoe”
程序清单如下。
USE adventureworks
SELECT CHARINDEX('shoe', addressline1,2) FROM person.address
WHERE addressid = '5'
SUBSTRING
例3-40显示如何只返回字符串的一部分。该查询在一列中返回person.contact表中的姓氏,在另一列中返回person.contact表中的名字首字母。
程序清单如下:
USE adventureworks
SELECT lastname, SUBSTRING(firstname, 1, 1)
FROM person.contact
ORDER BY lastname
流程控制语句
流程控制语句是指那些用来控制程序执行和流程分支的语句,在SQL Server 2005中,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。
1. IF…ELSE语句
例3-51 显示带有语句块的IF条件。如果产品的平均价格不低于$15,那么就显示文本:Average price is more than $15
程序清单如下。 http://zcz123.iyunv.com/Images/OutliningIndicators/ContractedBlock.gifhttp://zcz123.iyunv.com/Images/OutliningIndicators/ExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->USE adventureworks
IF (SELECT AVG(listprice) FROM production.product WHERE color = 'blue') < $15
BEGIN
PRINT 'The following product are excellent:'
PRINT ' '
SELECT SUBSTRING(name, 1, 15) AS name
FROM production.product
WHERE color = 'blue'
END
ELSE
PRINT 'Average price is more than $15.'
4.CASE语句
CASE语句可以计算多个条件式,并将其中一个符合条件的结果表达式返回。CASE语句按照使用形式的不同,可以分为简单CASE语句和搜索CASE语句。
它们的语法形式分别为:
CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ENDCASE
WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression END
例3-54 使用CASE函数去更改产品的分类显示,以使其更易于理解
程序清单如下。 http://zcz123.iyunv.com/Images/OutliningIndicators/ContractedBlock.gifhttp://zcz123.iyunv.com/Images/OutliningIndicators/ExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->USE adventureworks
SELECT Category =
CASE color
WHEN 'red' THEN 'red color'
WHEN 'black' THEN 'black color'
WHEN 'silver' THEN 'silver color'
WHEN 'yellow' THEN 'yellow color'
WHEN 'blue' THEN 'blue color'
END,
CAST(name AS varchar(25)) AS 'Shortened name',
listprice AS Price
FROM production.product
WHERE listprice IS NOT NULL
ORDER BY color, price
COMPUTE AVG(listprice) BY color
例3-55 使用搜索CASE函数,根据产品的价格范围将价格显示为文本注释
程序清单如下。 http://zcz123.iyunv.com/Images/OutliningIndicators/ContractedBlock.gifhttp://zcz123.iyunv.com/Images/OutliningIndicators/ExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->USE adventureworks
SELECT 'Price Category'=
CASE
WHEN listprice IS NULL THEN 'Not yet priced'
WHEN listprice < 10 THEN 'Very Reasonable Title'
WHEN listprice >= 10 and listprice < 20 THEN 'Coffee Table Title'
ELSE 'Expensive!'
END,
CAST(name AS varchar(20)) AS 'Shortened name'
FROM production.product
ORDER BY listprice
GO
例3-56 在嵌套的 IF...ELSE 和 WHILE 中使用 BREAK 和 CONTINUE。如果平均价格少于 $30,WHILE 循环就将价格加倍,然后选择最高价。如果最高价少于或等于 $50,WHILE 循环重新启动并再次将价格加倍。该循环不断地将价格加倍直到最高价格超过 $50,然后退出 WHILE 循环并打印一条消息。
程序清单如下: http://zcz123.iyunv.com/Images/OutliningIndicators/ContractedBlock.gifhttp://zcz123.iyunv.com/Images/OutliningIndicators/ExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->USE adventureworks
WHILE (SELECT AVG(listprice) FROM production.product) < $30
BEGIN
UPDATE production.product
SET listprice = listprice * 2
SELECT MAX(listprice) FROM production.product
IF (SELECT MAX(listprice) FROM production.product) > $50
BREAK
ELSE
CONTINUE
END
PRINT 'Too much for the market to bear'
7.WAITFOR语句 WAITFOR语句用于暂时停止执行SQL语句、语句块或者存储过程等,直到所设定的时间已过或者所设定的时间已到才继续执行。
WAITFOR语句的语法形式为:
WAITFOR { DELAY 'time' | TIME 'time' }
其中,DELAY用于指定时间间隔,TIME用于指定某一时刻,其数据类型为datetime,格式为‘hh:mm:ss’。
例3-58 使用WAITFOR TIME语句,以便在晚上10:20执行存储过程 update_all_stats。
程序清单如下:
BEGIN
WAITFOR TIME '22:20'
EXECUTE update_all_stats
END
8.RETURN语句 例3-59 显示如果在执行 findjobs 时没有给出用户名作为参数,RETURN 则将一条消息发送到用户的屏幕上然后从过程中退出。如果给出用户名,将从适当的系统表中检索由该用户在当前数据库内创建的所有对象名。
程序清单如下: http://zcz123.iyunv.com/Images/OutliningIndicators/ContractedBlock.gifhttp://zcz123.iyunv.com/Images/OutliningIndicators/ExpandedBlockStart.gifCode
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CREATE PROCEDURE findjobs @nm sysname = NULL
AS
IF @nm IS NULL
BEGIN
PRINT 'You must give a username'
RETURN
END
ELSE
BEGIN
SELECT o.name, o.id, o.uid
FROM sysobjects o INNER JOIN master..syslogins l
ON o.uid = l.sid
WHERE l.name = @nm
END