sqlserver 脚本和批处理指令小结
SQLServer脚本和批处理指令概述,适合初学者收藏
一、脚本基础
在SQLServer中,脚本主要用于执行一系列的SQL命令。以下是部分基础脚本语句的说明:
1. USE语句:
此语句用于设置当前的数据库环境,让我们可以在特定的数据库上执行后续的操作。
2. 变量声明:
使用DECLARE关键字来声明一个变量。变量在声明后,其初始值为NULL。为了安全地使用值,我们可以将系统函数赋值给变量。这样,只有当人为改变值时,变量值才会变动。这样可以避免由于系统函数的意外变动导致的不可预测的后果。
给变量赋值时,可以使用SET语句为变量赋予确切值或其他变量的值;当基于查询结果赋值时,则使用SELECT语句。
SQL Server 2005中有许多有用的系统函数,例如:@@ERROR用于返回错误代码,@@FETCH_STATUS与FETCH语句配合使用,@@IDENTITY返回自动生成的标识值等。
二、批处理
批处理是SQL Server中执行一系列T-SQL语句的方式。以下是关于批处理的一些重要点:
1. GO语句:
GO被当作一个结束批处理的标记。所有在GO之前的语句会被编译成一个执行计划并送往服务器。GO不是T-SQL命令,而是被编辑工具识别的命令。
2. 批处理中的错误:
批处理中可能会出现语法错误或运行时错误。为了处理这些错误,我们需要确保语句的正确性并适时使用GO来分隔不同的批处理。
3. 何时使用批处理:
有些命令如CREATE DATABASE, CREATE TABLE等需要独自成批处理。如果我们想将这些命令与其他命令组合成一个脚本,那么需要使用GO语句将它们分开,归入各自的批处理中。当需要考虑语句执行的优先顺序时,可以使用批处理。例如,在创建表之前,我们需要先创建数据库。但由于器的顺序问题,如果不使用批处理,可能会出现表被创建在系统数据库中的情况。我们需要通过批处理来确保执行的顺序和正确性。
在数据库的建设过程中,我们经常面临着一个挑战:如何在执行批处理脚本时确保数据库的正确创建顺序。当创建数据库的语句和创建表的语句在同一个批处理中时,问题就出现了。因为在进行脚本执行之前,数据库尚未诞生。为了解决这个问题,我们需要将创建数据库和创建表的脚本分开,使用GO语句将它们分为两个独立的批处理。正确的代码示例如下:
我们创建一个名为Test的数据库:
```sql
CREATE DATABASE Test
```
接着,我们使用刚才创建的Test数据库:
```sql
USE Test
```
然后,在Test数据库中创建一个名为TestTable的表:
```sql
CREATE TABLE TestTable ( col1 INT, col2 INT )
```
接下来,我们来动态SQL的使用以及EXE命令生成代码的相关知识。语法为`EXEC/EXECUTE ({字符串变量 | 字面值命令字符串})`。关于EXEC的作用域,我们需要明白一个事实:真正调用EXEC语句的行拥有与正在运行的批或过程中的其他代码相同的作用域。由EXEC语句结果执行的代码,被视为在其自己的批中运行。例如:
```sql
DECLARE @OutVar VARCHAR(50)
EXEC ('SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
```
在上述代码中,系统会报错,提示必须声明变量@OutVar。因为EXEC的语句形成了一个独立的批处理,其中的变量不能与其外部作用域沟通,只在批处理内部有效。@OutVar的值为NULL。正确的写法应该是:
```sql
EXEC ('DECLARE @OutVar VARCHAR(50); SELECT @OutVar = FirstName FROM Contact WHERE ContactID = 1')
```
我们看到在这两种作用域之间无法直接相互沟通。如果不采用外部机制(如临时表),我们无法在内部作用域和外部作用域之间传递信息。但是有一个例外,那就是系统函数,如@@ROWCOUNT这样的变量仍然可以使用。关于安全上下文和EXEC的关系,我们需要知道的是,当赋予某人运行存储过程的权利时,并不意味着他也能执行存储过程内部的动作。在一个EXEC语句内部建立的参照,默认在当前用户的安全上下文中运行。关于用户自定义函数和EXEC的关联,我们需要避免在同一个语句中运行函数和EXEC语句。正确的做法是先构建完整的字符串,然后使用EXEC执行这个字符串。对于EXEC的使用需要谨慎而细致,确保代码的安全性和准确性。
编程语言
- sqlserver 脚本和批处理指令小结
- 用JSP编写文件上传
- JS中实现一个下载进度条及播放进度条的代码
- 数据类型和Json格式分析小结
- PHP 多进程与信号中断实现多任务常驻内存管理实
- 你可能不知道的前端算法之文字避让(inMap)
- Angular.js与Bootstrap相结合实现表格分页代码
- ASP.NET中Cookie状态的说明与用法
- 菊花转动的jquery加载动画效果
- 使用jQuery制作浮动工具栏的实例分享
- Vue中的transition封装组件的实现方法
- vue3.0中的双向数据绑定方法及优缺点
- Thinkphp多文件上传实现方法
- PHP设计模式之装饰器模式实例详解
- 了解重排与重绘
- 学习ASP的理由 分析小结