第10讲分布式查询一、动态T-SQL语句1概述2语法结构3实例二、运用分布式查询1概述2链接方法3分布式查询例题上机:实验4数据查询1P204试一试2P209试一试13P209试一试24P210试一试5P212试一试6P213试一试7P218~P222例题8练习课件中的动态查询9练习课件中的分布式查询复习SELECT查询语句的语法如下:SELECT[ALL|DISTINCT]目标表达式[,目标表达式]…[INTO新表名]FROM表或视图名[,表或视图名]…[WHERE条件表达式][GROUPBY列名1[HAVING条件表达式]][ORDERBY列名2[ASC|DESC]]练习写出SELECT语句1从titles表的title_id,type,advance列中查询所有的advance不大于¥5500的business类型的书.2从titles表查询出版日期(pubdate)在1/1/1991~12/31/1991之间的书号(title_id)和出版日期(pubdate).答案1selecttitle_id,type,advancefromtitleswhereadvance=¥5500andtype=‘business’2selecttitle_id,pubdatefromtitleswherepubdatebetween‘1/1/1991’and‘12/31/1991’本讲参考书目[1][美]尼尔森著.刘瑞等译.MicrosoftSQLServer2000宝典.中国铁道出版社.2004.3[2]邹建.中文版SQLServer2000开发与管理应用实例.人民邮电出版社.2005.8一、动态T-SQL语句1概述对于动态T-SQL语句这个术语的定义还未形成一致的意见.主流的说法是:它描述了所有在运行时以动态方式组装为字符串并提交执行的SQLDML语句.使用动态T-SQL语句的一个常见的原因是,数据表的名称和列的名称不能直接使用变量代替,需要使用特殊的处理方法.例:下面的语法是错误的.DECLARE@tbnamevarchar(100)SET@tbname=‘titles’SELECT*FROM@tbname演示要使用动态的表名和列名的话,必须使用动态的T–SQL语句,例如上面的代码应该改为:DECLARE@tbnamevarchar(100)SET@tbname='titles'EXEC('SELECT*FROM'+@tbname)演示动态T-SQL语句特别适合于完成以下工作:●利用多个的查询条件来创建定制的where子句.●根据where子句的内容,创建定制的from子句,使其只包含所需要的表和连接.●根据用户的要求,动态地创建不同的orderby子句,按照不同的方式对数据进行排序.2语法结构SQLServer通过EXEC或sp_executesql来执行动态T-SQL语句.虽然在一般情况下,execute命令都是用来调用存储过程的,但实际上也可以使用它来执行T-SQL查询或者批处理.execute命令或者它的简写形式EXEC,实际上会为指定的批处理创建一个新实例,就好像所执行的代码是一个调用的存储过程一样.EXEC命令的语法如下:EXEC({@string_variable|[N]‘tsql_string’}[+…n])其中@string_variable是局部变量名称.可以是char、varchar、nchar或nvarchar数据类型,最大值为服务器的可用内存.如果字符串长度超过8000字节,则把多个局部变量串联起来用于EXEC字符串.N‘tsql_string’是一个常量,可以是nvarchar或varchar数据类型.如果包含N,则该字符串将解释为nvarchar数据类型.另一种执行动态T-SQL语句的新方法是使用sp_executeSQL系统存储过程.与使用execute命令相比,这种方法与复杂的SQL语句更加兼容.在一些情况下,无法使用execute命令执行的动态SQL语句,却可以使用sp_executeSQL顺利地执行.使用sp_executeSQL的语法如下:EXECsp_executeSQL‘tsql_query’,parametersdefinition[,…n]不能使用串联的字符串作为’tsql_query’,所以需要使用参数来满足这一需要.提供SQL语句和参数定义必须使用Unicode字符串.使用参数可以优化性能.如果在每次执行SQL语句时都使用同样的参数,就应该使用sp_executeSQL以及相应的参数来执行它,这样做可以保存查询计划,以后进行优化.例如下面的语句EXECsp_executeSQLN'selectProductID,ProductName,UnitPricefromdbo.ProductswhereProductID=@Productselect',N'@ProductselectINT',@Productselect=15演示例讲解一个存储过程中应用动态T-SQL语句的实例.演示3实例二、运用分布式查询1概述数据很少会全都存放在同一地点.在如今地分布式世界中,绝大多数新的项目都需要增强原有的系统,它们至少要能连接到已有的数据.这对SQLServer来说不是问题,因为它可以对绝大多数的数据源进行读、写操作.它甚至可以把SQLServer的数据与Excel电子表格作异构连接.SQLServer提供了几种存取当前数据库之外的数据的方法.从简单的引用另外一个本地数据库到执行直接传递查询来操作另外一个客户/服务器数据库中地数据,SQLServer都能加以处理,而且涉及到多个SQL服务器的数据修改操作仍然可以保持原子性.链接到外部数据源要做的工作只不过是:配置好链接服务器的名字、以及相应的位置和登录信息,这样SQLServer就可以存取链接服务器上的数据了.链接是一个单向配置.如果在服务器A链接到服务器B,意味着A知道如何登录和访问服务器B,SQLServer实例A可以存取实例B中的数据.而对于服务器B而言,服务器A只不过是另外一个普通用户而已.如果链接服务器对你来说是一个新概念,那么你很可能会把它与企业管理器的服务器注册弄混淆.企业管理器只能作为客户应用程序与服务器通信,而链接服务器则可以使SQLServer实例A直接与SQLServer实例B通信.可以使用企业管理器或者是T-SQL代码来建立链接.虽然使用代码建立链接需要完成更多的工作,但建立的代码可以重复使用,当需要快速地重建链接时就很方便.链接服务器可以是SQLServer或者任何其他的OLEDB和ODBC数据源.只要相应的OLEDB提供程序或者ODBC驱动程序支持,分布式查询可以检索和修改相应数据源中的数据.SQLServer查询可以通过引用预先配置好的链接服务器或直接在查询代码中指定链接的方法来引用外部数据.2链接方法●存取本地数据源当你存取同一个服务器上另一个数据库中的数据时,由于处理数据时使用的是同一个SQLServer引擎,所以尽管所查询的数据位于本地数据库之外,这样的查询仍然不是真正的分布式查询.存取本地数据源只需在被引用的表前加上数据库名即可.Server.Database.Owner.ObjectName因为数据库位于同一服务器,所以服务器名是可选项.通常情况下,数据库中的表都为数据库的所有者所拥有,这时,也可以省略表的所有者的名字:usepubsselectemp_id,fnamefromNorthwind.dbo.employee●链接到外部数据源这一工作可以使用企业管理器或T-SQL代码来做.例如,使用企业管理器建立链接的方法是:在企业管理器中,服务器下,‘安全性’节点下的‘链接服务器’上右键单击,选’新建链接服务器’选项,在打开的‘链接服务器属性‘对话框中填写相应的项.演示链接到外部数据源的代码.例1连接到excel的代码.execsp_addlinkedserver@server='book3',@srvproduct='excel',@provider='microsoft.jet.oledb.4.0',@datasrc='e:\book3.xls',@provstr='excel5.0‘演示链接到外部数据源的代码.例2连接到access的代码.execsp_addlinkedserver'cha1','access2000','microsoft.jet.oledb.4.0','e:\db1.mdb'演示3分布式查询例题例1查询外部数据源excel中的数据.select*frombook3...sheet1$例2查询外部数据源Access中的数据并生成SQLServer表.select*intopubs.dbo.lsfromcha1...cha1演示