標簽:input 順序 循環語句 info wait 跳轉 維護 esc 批處理
SqlServer的變量分为两种,分别是用户自己定义的局部變量,用 “@” 开头的标识符表示。第二种是系统定义和維護的全局變量,用 “@@” 开头的标识符表示。
局部變量的作用范围为定义局部變量的批處理、存储过程、触发器或语句块,變量不能是 text、ntext 或 image 数据类型。
定义局部變量的语法为:
DECLARE @局部變量名 数据类型[ ,…n]
局部變量在赋值之前默认为 NULL,如果在程序中引用它必须要先赋值。可以用 SET 语句给局部變量赋值,语法如下:
SET @局部變量名 = 變量值
也可以在查询语句 SELECT 中给局部變量赋值,语法如下:
SELECT{@局部變量名 = 變量值}[,…n]
要输出局部變量的值,可以使用 SELECT 语句。
SELECT @局部變量
任何的程序都可以通过 3 种基本结构相互嵌套组成,分别是順序结构、选择结构和循环结构。控制程序执行順序的语句称为流程控制語句,T-SQL 提供了如下的流程控制語句,用于编写过程性代码的语法结构。
控制流語句 | 說明 |
---|---|
BEGIN…END | 程序塊語句 |
IF…ELSE | 條件處理語句 |
CASE | 分支語句 |
WHILE | 循環語句 |
GOTO | 无条件跳轉语句 |
RETURN | 無條件退出語句 |
WAITFOR | 延遲語句 |
BREAK | 跳出循環語句 |
CONTINUE | 跳出本次循環語句 |
順序结构按照语句的先后順序依次执行,无须使用专门的控制语句。有时候,为了区分不同的语句块,可以采用复合语句的形式。即用 begin…end 括起来进行语句块的界定,相当于 C 语言中的 “{}”,BEGIN 和 END 语句必须成对使用。
BEGIN
{
sql_statement | statement_block
}
END
选择结构表示有不同的路径,但需要根据一个条件来判断执行哪条路径。IF…ELSE 條件處理語句,实现编程中的分支结构。
IF Boolean_expression
{ sql_statement | statement_block }
[ ELSE
{ sql_statement | statement_block } ]
多条件分支选择 CASE 实现多分支选择结构,类似于 C 语言的 Switch。CASE具有以下两种格式,首先是简单表达式,将某个表达式与一组简单表达式进行比较以确定结果。
CASE input_expression
WHEN … THEN …
[ ...n ]
[ ELSE … ]
END
第二種是選擇表達式,計算一組布爾表達式以確定結果。
CASE
WHEN … THEN …
[ ...n ]
[ ELSE … ]
END
循环就是重复执行的意思,有的语句需要反复执行才能结束,这就是循環語句。循环结构中必须含有循環語句。循環語句是 WHILE,语法为:
WHILE Boolean_expression --布尔表达式,进行条件判断
{ sql_statement | statement_block }
[BREAK] --跳出本层循环
{ sql_statement | statement_block }
[CONTINUE] --跳出本次循环
{ sql_statement | statement_block }
WAITFOR 语句的功能是,当程序执行到该语句时,暂时停止程序执行。直到所设定的等待时间已过或到了所设定的时间,才继续向下执行程序。
WAITFOR {DELAY ‘延时时间’ | TIME ‘到达时间’}
SQL Server 允许用户设计自己的函数,以补充和扩展系统提供(内置)函数的功能。用户定义函数采用零或多个输入参数并返回标量值或表,SQLServer 支持三种用户定义函数。
標量函數返回一个标量(单值)结果,可在与標量函數返回的数据类型相同的值所能使用的任何位置使用该標量函數。创建標量函數的语法是:
CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS scalar_return_data_type
[ WITH < function_option> [ [,] ...n] ]
[ AS ]
BEGIN
function_body
RETURN scalar_expression
END
多語句表值函數返回一个由一条或多条 Transact-SQL 语句建立的表,类似于存储过程。与存储过程不同的是,多語句表值函數可以在 SELECT 语句的 FROM 子句中被引用。创建多語句表值函數的语法是:
CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS TABLE
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
RETURN [ ( ] select-stmt [ ) ]
內嵌表值函數返回一个单条 SELECT 语句产生的结果的表,类似于视图。內嵌表值函數可使用参数,提供了更强的适应性,扩展了索引视图的功能。创建內嵌表值函數的语法是:
CREATE FUNCTION [ owner_name.] function_name
( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] )
RETURNS @return_variable TABLE < table_type_definition >
[ WITH < function_option > [ [,] ...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
< function_option > ::=
{ ENCRYPTION | SCHEMABINDING }
< table_type_definition > ::=
( { column_definition | table_constraint } [ ,...n ] )
編寫函數Fmax,求二数大者。
CREATE FUNCTION Fmax (@x int,@y int)
RETURNS int
AS
BEGIN
DECLARE @Z INT
IF @X>@Y
SET @Z=@X
ELSE
SET @Z=@Y
RETURN(@Z)
END
SELECT DBO.fMAX(1,2)
編寫函數Fc,参数为两个整数和一个运算符(+,-,*,/),计算其结果。
CREATE FUNCTION FC (@x int,@y int,@C CHAR)
RETURNS int
AS
BEGIN
DECLARE @Z INT
SET @Z = CASE @C
WHEN ‘+‘ THEN @X+@Y
WHEN ‘-‘ THEN @X-@Y
WHEN ‘*‘ THEN @X*@Y
WHEN ‘/‘ THEN @X/@Y
END
RETURN(@Z)
END
SELECT DBO.fC(1,2,‘+‘)
CREATE FUNCTION Fsum(@n INT)
RETURNS int AS
BEGIN
DECLARE @sum INT, @i INT
SET @sum = 0
SET @i = 1
WHILE @i <= @n
BEGIN
SET @sum = @sum + @i
SET @i = 1 + @i
END
RETURN(@sum)
END
SELECT DBO.Fsum(100)
Student 表、Score 表和 Course 表中有如下一些数据。
編寫函數 Fs,参数为姓名和课程名,返回该生该课程的成绩。
CREATE FUNCTION FS (@xM NCHAR(4),@KCM VARCHAR(20))
RETURNS DECIMAL(4,1)
AS
BEGIN
DECLARE @Z DECIMAL(4,1)
SELECT @Z = DEGREE
FROM Student S
JOIN Score SC ON SC.SNO=S.SNO
JOIN Course C ON C.CNO=SC.CNO
WHERE SNAME = @XM AND CNAME = @KCM
RETURN(@Z)
END
SELECT DBO.fS(‘李君帅‘, ‘计算机导论‘)
編寫函數 Fsc,参数为姓名,返回该生的所有成绩。
CREATE FUNCTION Fsc(@XM Nchar(4))
RETURNS TABLE
AS
RETURN (
SELECT SNAME,CNAME,DEGREE
FROM Student S
JOIN Score SC ON SC.SNO = S.SNO
JOIN Course C ON C.CNO = SC.CNO
WHERE SNAME = @XM
)
SELECT * FROM DBO.Fsc(‘李君帅‘)
編寫函數 FRANK,参数为学号,返回该生平均分班级排名。
CREATE FUNCTION FRANK(@sno char(3))
RETURNS int
AS
BEGIN
DECLARE @rank INT
DECLARE @class CHAR(5)
SET @class = (SELECT class FROM Student WHERE Sno = @sno)
SET @rank = (
SELECT a_rank
FROM (
SELECT row_number() OVER(ORDER BY AVG(Degree) DESC) a_rank, S.Sno
FROM Score SC
JOIN Student S ON S.Sno = SC.Sno
WHERE Class = @class
GROUP BY s.sno
) T
WHERE T.Sno = @sno
)
RETURN @rank
END
SELECT DBO.FRANK(101)
編寫函數 FCJA,参数为姓名或姓名一部分,返回该生的所有课程的成绩(学号,姓名,课程名,成绩等级)。选修成绩等级 A:90~100 B:80~90 C: 70~80 D:60~70 E:<60。
CREATE FUNCTION FCJA010(@sname nvarchar(4))
RETURNS TABLE AS
RETURN(
SELECT SC.Sno, Sname, Cname, Degree,
CASE
WHEN Degree < 60 THEN ‘A‘
WHEN Degree >= 60 AND Degree < 70 THEN ‘B‘
WHEN Degree >= 70 AND Degree < 80 THEN ‘C‘
WHEN Degree >= 80 AND Degree < 90 THEN ‘D‘
WHEN Degree >= 90 AND Degree <= 100 THEN ‘E‘
ELSE ‘N‘
END 等级
FROM Score SC
JOIN Student S ON SC.Sno = S.Sno
JOIN Course C ON C.Cno = SC.Cno
WHERE Sname like ‘%‘+ @sname +‘%‘
)
SELECT * FROM FCJA(‘李君‘)
《SqlServer 2014 數據庫技术实用教程》,胡伏湘、肖玉朝 主编,清华大学出版社
標簽:input 順序 循環語句 info wait 跳轉 維護 esc 批處理
原文地址:https://www.cnblogs.com/linfangnan/p/14825243.html