SQL Server编程语言

概述

SQL是关系型数据库管理系统的标准语⾔,SQL是英⽂Structured Query Language的缩写,意思为结构化查询语⾔。Transact-SQL (T-SQL) 是SQL的专有扩展。 它支持声明变量、字符串和数据处理、错误和异常处理以及事务控制。 虽然 SQL 是一种编程语言,但 T SQL 添加了对过程化编程和使用局部变量的支持。
T-SQL 程序通常会以 BEGIN 语句开头,以 END 语句终止,二者之间是你要执行的语句。下面简单介绍一下T-SQL程序。

T-SQL语法简介

下面是一些支持的 T-SQL 编程结构:
DECLARE:用于定义变量。
SET:将值分配给变量的方式之一。
BEGIN…END:定义一系列要一起执行的 T-SQL 语句。
IF…ELSE:条件选择语句,在布尔表达式的基础上选择执行代码的哪些方面。
WHILE:创建一个循环,该循环在提供的条件为 true 时执行。适合运行 T-SQL 语句的迭代。
其他关键字:BREAKCONTINUEWAITFORRETURN 用于支持 T-SQL 流程控制操作。
GO:T_SQL批处理(一个或多个 T-SQL 语句的集合)的批次终止符,GO 不是 T-SQL 关键字,而是SQL Server Management Studio (SSMS) 用来识别和指示批次结尾的符号。

T_SQL编程语法实例

1、首先是变量的声明、赋值以及使用。

要声明变量必须使用 DECLARE 语句为变量指定一个名称,名称的第一个字符必须为一个 @,并且为变量指定系统提供的或用户定义的数据类型和长度。 对于数值变量还指定精度和小数位数。 对于 XML 类型的变量,可以指定一个可选的架构集合。如下面创建名为 @var1 且数据类型为 int 的局部变量:

DECLARE @var1 INT;

若要声明多个局部变量,中间需使用英文逗号分隔,如下面定义三个变量@a,@b,@c类型分别为NVARCHAR,VARCHAR,NCHAR,类型后面的括号中指定了变量的长度,并且将变量的值都初始化为NULL。

DECLARE @a NVARCHAR(30), @b VARCHAR(20), @c NCHAR(2);

为变量赋值一般使用以下三种方式:
在 SQL Server 2008 或更高版本中,可以使用 DECLARE 语句在声明时初始化变量。
在 SQL Server 的任何版本中,可以使用 SET 语句赋单个(标量)值。
在 SQL Server 的任何版本中,可以使用 SELECT 语句给变量赋值。 请确保 SELECT 语句只返回一行。 如果结果为空,将保留变量的原始值;如果有多个结果,将返回最近的结果,如下:

DECLARE @var1 INT = 10;
DECLARE @var2 NVARCHAR(255);
SET @var2 = N'string';
DECLARE @var3 NVARCHAR(20);
SELECT @var3 = 'string';
SELECT @var1 AS var1, @var2 AS var2, @var3 AS var3;

返回结果如下图:在这里插入图片描述
对于变量的使用需要注意变量的作用域,只能使用同一批次中声明的变量,因为变量具有局部作用域,只在定义它们的批处理或过程中可见。例如上例语句如果改为如下情况则会报错:

DECLARE @var1 INT = 99;
DECLARE @var2 NVARCHAR(255);
SET @var2 = N'string';
DECLARE @var3 NVARCHAR(20);
SELECT @var3 = 'string';
GO
SELECT @var1 AS var1, @var2 AS var2, @var3 AS var3;

报错如下图:在这里插入图片描述

2、批处理的使用。

T-SQL 批处理是一个或多个 T-SQL 语句的集合,由客户端将其作为一个统一单元提交给 SQL Server。 SQL Server 在分析、优化和执行代码时,会同时对批处理中的所有语句进行操作。由客户端应用程序对不同批次进行分隔。 如何标记某个批次的结束时间取决于客户端的设置。 对于包含 SQL Server Management Studio (SSMS)、Azure Data Studio 和 SQLCMD 的 Microsoft 客户端,关键字为 GO。
例如下面的语句创建了一个临时表#temp1并且分两批插入了一些数据,第一批插入的语句中包含一个错误:

CREATE TABLE #temp1 (工号 INT,姓名 NVARCHAR(20),工龄 INT,工资 INT)
GO
INSERT INTO #temp1 (工号,姓名,工龄,工资) VALUES (101,'张三',10,5000)
INSERT INTO #temp1 (工号,姓名,工龄,工资) VALUE (102,'李四',6,4000)
INSERT INTO #temp1 (工号,姓名,工龄,工资) VALUES (103,'王五',5,3850)
GO
INSERT INTO #temp1 (工号,姓名,工龄,工资) VALUES (100,'赵六',16,8000)
INSERT INTO #temp1 (工号,姓名,工龄,工资) VALUES (104,'小红',3,3500)
GO
select * from #temp1
GO

执行结果和显示的错误信息如下:
在这里插入图片描述在这里插入图片描述

错误发生第二个批次的第二行,但同一个批次的第一行和第三行都没有执行,也就是说如果某一个批次出现语法错误,将拒绝整个批次,可以看到虽然第二个批次发生错误但其他批次都执行成功,所以,错误的影响范围仅限同批次内,不会影响其他批次执行。
使用 T-SQL 批处理时,需要牢记两个重要的注意事项:
批次是变量范围的边界,这意味着在一个批次中定义的变量只能由同一批次中的其他代码引用。
某些语句(通常是数据定义语句,如 CREATE VIEW、CREATE FUNCTION 和 CREATE PROCEDURE)可能无法与其他语句在同一批次中结合使用。

3、SQL SERVER中的流程控制。

IF…ELSE 条件逻辑的使用。 在数据控制操作中,将 IF 与 EXISTS 关键字一起使用可以高效执行存在检查,以下示例演示如何避免在之前的临时表#temp1中插入相同工号的数据:

DECLARE @jobno INT, @name NVARCHAR(20) , @workyears INT ,@salaries INT
set @jobno = 100 ;set @name = '小明';set @workyears= 1;set @salaries=3000
--下面括号中的查询有数据则会执行第一个BEGIN..END中的语句,否则就执行ELSE后面的BEGIN..END中的语句
IF EXISTS (select * from #temp1 where 工号=@jobno) 
BEGIN 
PRINT '工号'+cast(@jobno as NVARCHAR)+'已被占用请更换其他工号'
END
ELSE
BEGIN
INSERT INTO #temp1 (工号,姓名,工龄,工资) VALUES (@jobno,@name,@workyears,@salaries)
PRINT @name+'插入成功'
END

执行结果如下:在这里插入图片描述

WHILE 循环语句的简单使用。
以下例子使用WHILE循环更新上面的临时表#temp1,使每个工人的工资增加工龄数的2倍。

DECLARE @VAR1 INT
select @VAR1=MAX(工龄) from #temp1
WHILE @VAR1>0
BEGIN
IF EXISTS(select * from #temp1 where 工龄=@VAR1)
BEGIN
UPDATE #temp1 SET 工资=工资+工龄*2 where 工龄=@VAR1
PRINT '工资修改成功'
END
SET @VAR1=@VAR1-1
END
GO
select * from #temp1
GO

执行后得到结果如下:
在这里插入图片描述

其他关键字
BREAK语句的作用是结束当前循环,CONTINUE语句的作用是忽略CONTINUE之后的语句直接开始下一次循环。
这两个语句经常和IF语句结合使用。WAITFOR语句用于阻止执行批处理、存储过程或事务,直到已过指定时间或时间间隔,或者指定语句发生修改或至少返回一行为止。RETURN语句用于从查询、存储过程或批处理语句块中无条件退出并返回一个结果,如果是用于存储过程,RETURN 不能返回 null 值,RETURN 之后的语句是不执行的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵润强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值