sqlserver 脚本和批处理指令小结

一.脚本基础
    
1.USE语句
         
设置当前数据库。
    
2.声明变量
          语法:DECLARE @变量名
变量类型
         
在声明变量后,给变量赋值之前,变量的值为NULL。
         
将系统函数赋给声明的变量,这个方法可以使我们能更安全地使用值,该值只有人为地改变时它才变动。如果直接使用系统函数本身,那么当它发生变动时,有
    
时会无法确定其究竟为何,因为大多数系统函数值是由系统确定的。这容易在你不预期的情况下导致系统改变了值,引起不可预期的后果。
         
(1).给变量赋值
              
SET:当进行变量赋值是,该值已经知道是确切值或者是其他变量时,使用SET。
              
SELECT:当变量赋值基于一个查询时,使用SELECT。
         
(2).系统函数
              
SQL Server
2005中有30多个无参的系统函数,其中一些最重要的如下:
              
@@ERROR:                   
返回当前连接下,最后执行的T-SQL语句的错误代码,如无错误返回0。
              
@@FETCH_STATUS:      
和FETCH语句配合使用。
              
@@IDENTITY:               
返回最后一句运行语句的、自动生成的标识值,作为最后INSERT或者SELECT
INTO语句的结果。
              
@@ROWCOUNT:             
返回最后一个语句影响的行数。
              
@@SERVERNAME:         
返回脚本正在其上运行的本地服务的名字。
              
@@TRANCOUNT:           
返回活动事务的数量,特别是针对当前连接的事务的瓶颈程度。

二.批处理
    
(1).GO单独占一行。在同一行上,T-SQL语句不能在GO语句之前。
    
(2).所有语句从脚本开始处或者上一个GO语句开始编译,直到下一个GO语句或者脚本结束,将这段代码编译到一个执行计划中并相互独立地送往服务器。前一
 个执行计划中发生错误,不会影响后一个执行计划。
    
(3).GO不是一个T-SQL命令,只是被编辑工具识别的命令。当编辑工具碰到GO,它把GO看做一个结束批处理的标记,将其打包,然后作为一个独立单元发送到
 服务器——不包括GO,服务器对于GO没有任何概念。          
    
1.批处理中的错误
         
语法错误,运行时错误。
    
2.何时使用批处理
         
(1).独自成批处理的语句
              
有几个命令必须独自成批处理,它们包括:
                   
CREATE
DEFAULT
                   
CREATE
PROCEDURE
                   
CREATE
RULE
                   
CREATE
TRIGGER
                   
CREATE
VIEW
              
如果想将这些语句中的任何一条和其他语句组成单独的一个脚本,那么需要采用一个GO语句将它们分别断开,归入各自的批处理中。
         
(2).使用批处理建立优先级
              
使用批处理最可靠的例子是,当需要考虑语句执行的优先顺序时,也就是说,需要一个任务在另一个任务开始前执行。
              
例如:
                   
CREATE DATABASE
Test

复制代码代码如下:

CREATE TABLE
TestTable 

col1 INT, 
col2 INT 
)

执行语句,会发现生成的表没有在Test数据库中,而是在master数据库中(如果当前使用的数据库是系统数据库)。因为在执行脚本的时候,使用的数据
         
库是系统数据库,该数据库是当前的,所以生成的表在系统数据库中。看起来,应该在创建表之前指定数据库Test。然而,这样仍然存在问题。解析器试图校
         
验代码,发现我们用USE命令引用的数据库并不存在。原因在于创建数据库的语句和创建表的语句写在一个批处理中,在执行该脚本之前,当然数据库还没有
         
创建。根据批处理的要求,我们将创建数据库和创建表的脚本用GO语句分为两个独立的批处理。正确代码如下:

复制代码代码如下:

CREATE DATABASE
Test 
GO 

USE Test 
CREATE TABLE
TestTable 

col1 INT, 
col2 INT 
)

三.动态SQL:使用EXE命令生成代码
    
语法:EXEC/EXECUTE ({<字符串变量> |
‘<字面值命令字符串>‘})
    
1.EXEC的作用域
         
真正的调用EXEC语句的行,拥有同该EXEC语句正在运行的批或过程中的其他代码相同的作用域。但是作为EXEC语句结果而被执行的代码,被认为是在它自
    
己的批中。
         
例如:
         
DECLARE @OutVar
VARCHAR(50)
         
EXEC (‘SELECT @OutVar = FirstName FROM Contact WHERE ContactID =
1‘)
         
这里系统会报错,指出必须声明变量@OutVar。因为EXEC的语句独自成为一个批处理,其中的变量不能和其外的作用域相沟通,只在这个批处理中有效。此
    
时,@OutVar的值为NULL。正确的写法如下:
         
EXEC (‘DECLARE @OutVar
VARCHAR(50)
                   
SELECT @OutVar = FirstName FROM Contact WHERE ContactID =
1‘)
         
这里,我们看到两中不同的作用域,这两种作用域间不能相互沟通。如果不采用外部机制,比如一个临时表,我们就没有办法实现在内部作用域和外部作用域
    
之间传递信息。有一个例外的事情是可以在EXEC的区域内部出现,并且也能在EXEC执行后被看到,这就是系统函数。因此,像@@ROWCOUNT这样的变量仍然
    
能够被使用。
    
2.安全上下文和EXEC
         
当赋予某人权利运行一个存储过程,意味着他也能获得权利去执行存储过程内部的动作。比如,有一个存储过程用来列出去年内所有的雇佣员工。其中有权限
    
执行该存储过程的人,才能够执行并返回结果——即使他没有权限直接访问人力资源的员工表。
         
这样隐含权限对于EXEC语句是无效的。在默认情况下,任何在一个EXEC语句内部建立的参照,都将在当前用户的安全上下文中运行。因此,我们有权利去访
    
问一个叫spNewEmployee的存储过程,但是却没有权利去访问员工表。如果spNewEmployee通过一个简单的SELECT语句获得值,那么一切正常。但是如果
    
pNewEmployee使用EXEC语句去执行一个SELECT语句,这个EXEC语句将失败——因为没有权利访问员工表。
    
3.用户自定义函数和EXEC关联
         
不能在同一个语句中同时运行一个函数和EXEC语句。例如:
         
DECLARE @Num
INT
          SET
@Num = 3
         
EXEC (‘SELECT LEFT(LastName, ‘ + CAST(@Num AS VARCHAR) + ‘) AS FilingName FROM
Contact‘)
         
这个语句会返回一个错误消息,因为CAST函数需要在EXEC所在行之前被解析。正确代码如下:
         
DECLARE @Num
INT 
         
DECLARE @str
VARCHAR(255)
         
SET @Num =
3
          SET
@str = ‘SELECT LEFT(LastName, ‘ + CAST(@Num AS VARCHAR) + ‘) AS FilingName FROM
Contact‘
         
EXEC
(@str)
         
这个例子工作正常,因为EXEC的输入值已经是一个完整的字符串。
    
4.EXEC和用户自定义函数
         
一般来说,不允许用户自定义函数内部使用EXEC去运行动态SQL,但是,使用EXEC运行一个存储过程,少数情况是合法的。

时间: 2024-11-08 20:33:51

sqlserver 脚本和批处理指令小结的相关文章

分享一个SQLSERVER脚本

原文:分享一个SQLSERVER脚本 分享一个SQLSERVER脚本 很多时候我们都需要计算数据库中各个表的数据量很每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo VARCHAR(50) , rowsinfo BIGINT , reserved VARCHAR(20) , datainfo VARCHAR(20) , index_size VARCHAR(20) , unused VARCHAR(20) ) DECLARE @

sqlserver 脚本 多条记录遍历

临时表方式实现多条记录遍历 declare @oper_cart_item_id bigint; declare @oper_cart_id bigint; declare @the_last_changed_date datetime; declare @oper_cust_id int; select * , 0 as flag into #shoppingcart_temp from deleted; while exists (select top 1 1 from #shoppingc

批处理指令_同步数据脚本

@echo off set Path1=H:dir1 set Path2=H:dir2 set Path3=H:dir3 set Path4=H:dir4 cd C:\Program Files\TortoiseSVN\bin start TortoiseProc.exe /command:update /path:"%Path1%*%Path2%*%Path3%*%Path4%" /closeonend:3 @pause for /f "delims=" %%i

JSP基本语法总结【1】(jsp工作原理,脚本元素,指令元素,动作元素)

时隔半年,回头对jsp复习整理一下,温故而知新. jsp工作原理: jsp服务器管理jsp页面分两个阶段:转换阶段(translation phase)和执行阶段(execution phase). 客户发送请求时,服务器检验jso语法是否正确,然后转换成servlet源文件,然后调用javac工具类便宜servlet源文件生成class文件,此阶段为转换阶段. 接下来,servlet容器加载转换后的servlet类,实例化一个对象来处理客户端的请求.请求处理后,响应对象被jsp服务器接收,服务

[服务器]脚本:批处理带参数ping命令 发送邮件脚本

1.批处理带参数ping命令 @echo offecho Input you IP address ......set /p IP=echo Your IP number is %IP%.ping %IP%set IP=pause 2.发送告警脚本 For counter = 1 To 3 Step 1SendMailNext Public Sub SendMailNameSpace = "http://schemas.microsoft.com/cdo/configuration/"

JavaWeb学习(二)----JSP脚本元素、指令元素、动作元素

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4048033.html 联系方式:[email protected] [正文] 我们在上一篇文章中学习到了Tomcat的使用和工程文件部署,并明白了jsp文件是怎样发布到服务器上并最终显示出来:JavaWeb学习(一)----JSP简介及入门(含Tomcat的使用) 现在来学习一下JSP的基本语法

SQL入门经典(七) 之脚本和批处理

什么是脚本.我们前面学的CREATE TABLE <table name> ,USE <database name>这些都是脚本,为什么用脚本.脚本存储到文件中并且可以重复利用和提取的文件. 创建变量: DECLARE语句最常用的语法: DECLARE @<variable name> <variable type>[=value][[,@<variable name> <variable type>[=value]@<vari

Shell脚本----安装Hadoop过程小结

启动$HADOOP_HOME/bin或者$HADOOP_HOME/sbin下的脚本,shell终端会显示输出信息: 根据输出信息,利用bash -x [script-name]的信息以及脚本本身,可以定位出错误是从什么位置开始的: 以下是在这些过程中,自己遇到的问题,以及是如何解决的: 1.在调用stop-yarn.sh脚本,关闭ResourceManager以及NodeManger的时候,会出现no NodeManager to stop; 但是自己ssh到自己的slave节点,jps之后仍然

ASP.NET aspx页面中 写C#脚本; ASP.NET 指令(&lt;%@%&gt;);

1 <h2>Welcome</h2> <ul> <% for (int i = 0; i <= Convert.ToInt32(ViewData["numtime"]); i++) {%> <li><%= ViewData["Message"].ToString() %></li> <% } %> </ul> "{" 是语言的一部分,