SQL、数据处理用友软件股份有限公司大纲企业管理器事件探察器查询分析器导入和导出数据SQL语句视图存储过程跟踪案例分析企业管理器定义:企业管理器是SQL的主要管理工具,它提供了一个以管理控制台(MMC)的用户使用界面。它提供了: 定义运行SQLServer的服务器组。 将个别服务器注册到组中。 为每个已注册的服务器配置所有SQLServer选项。 在每个已注册的服务器中创建并管理所有SQLServer数据库、对象、登录、用户和权限。 在每个已注册的服务器上定义并执行所有SQLServer管理任务。 通过唤醒调用SQL查询分析器,交互地设计并测试SQL语句、批处理和脚本。 唤醒调用为SQLServer定义的各种向导企业管理器界面企业管理器系统库:MASTER、MODLE、MSDB、TEMPDB系统表:(部分)企业管理器常用功能数据库备份、还原数据库附加、分离数据库数据表、视图、存储过程、触发器结构的管理数据库收缩数据库数据的添加、删改事件探察器定义:SQL事件探查器是图形工具,使系统管理员得以监视SQL实例中的事件。可以捕获有关每个事件的数据并将其保存到文件或SQL表中供以后分析,提供了: 监视SQL实例的性能。 调试SQL语句和存储过程。 识别执行慢的查询。 在工程开发阶段,通过单步执行语句测试SQL语句和存储过程,以确认代码按预期运行。 通过捕获生产系统中的事件并在测试系统中重播它们来解决SQL中的问题。这对测试和调试很有用,并使得用户可以不受干扰地继续使用生产系统。 审核和复查在SQL实例中发生的活动。这使得安全管理员得以复查任何审核事件,包括登录尝试的成功与失败,以及访问语句和对象的权限成功与失败。事件探察器跟踪属性:事件探察器跟踪结果:查询分析器定义:SQL查询分析器是一种图形工具,您可以使用它进行以下操作: 创建查询和其它SQL脚本,并针对SQLServer数据库执行它们。("查询"窗口) 由预定义脚本快速创建常用数据库对象。(模板) 快速复制现有数据库对象。(对象浏览器脚本功能) 在参数未知的情况下执行存储过程。(对象浏览器过程执行功能) 调试存储过程。(SQL调试程序) 调试查询性能问题。(显示执行计划、显示服务器跟踪、显示客户统计、索引优化向导) 在数据库内定位对象(对象搜索功能),或查看和使用对象。(对象浏览器) 快速插入、更新或删除表中的行。("打开表"窗口) 为常用查询创建键盘快捷方式。(自定义查询快捷方式功能) 向"工具"菜单添加常用命令。(自定义"工具"菜单功能)查询分析器界面:查询分析器应用:执行SQL语句,脚本对表、视图、存储过程、触发器的创建、修改、删除及脚本分析导入和导出数据定义:在连接到源和目的之后,可以选择要导入或导出的数据,并可对要复制的数据应用各种转换,在大多数情况下,可以自动与源数据一起复制主键和外键约束,可用的数据源: 大多数的OLEDB和ODBC数据源以及用户指定的OLEDB数据源。 文本文件。 到一个或多个MicrosoftSQLServer™实例的其它连接。 Oracle和Informix数据库。必须已经安装Oracle或Informix客户端软件。 MicrosoftExcel电子表格。 MicrosoftAccess和MicrosoftFoxPro®数据库。 dBase或Paradox数据库。导入和导出数据应用:导入和导出数据常用功能:SQL语句Select特性:SELECT后可以有常量,变量,字段,计算结果,函数,内嵌Select语句。From后有一个或多个表,视图,函数(返回表),或内嵌Select语句,相互之间可以通过后面的Where条件约束,也可以通过连接(join)建立关联(此方面同样使用于更新脚本)where后有一个或多个逻辑条件的AND或OR的逻辑组合而成groupby列出需要分类的数据列,同时注意Select可以列出的除了Groupby后分类数据列外,不能有其他数据列,主要是聚合函数having列出分类后的数据的一个或多个逻辑条件的and或or的逻辑组合,同时逻辑条件中的数据列除了Groupby的分类列以外不能有其他数据列,主要是聚合函数SQL语句函数—系统函数Case:计算条件列表并返回多个可能结果表达式之一,CASE具有两种格式:简单CASE函数将某个表达式与一组简单表达式进行比较以确定结果,CASE搜索函数计算一组布尔表达式以确定结果,两种格式都支持可选的ELSE参数。例(1):selectsum(CASEcvoutypewhen'01'thenisnull(iainquantity,0)when'70'then+isnull(iainquantity,0)WHEN'10'then+isnull(iainquantity,0)when'08'then+isnull(iainquantity,0)when'09'then-isnull(iaoutquantity,0)when'27'then-isnull(iaoutquantity,0)when'11'then-isnull(iaoutquantity,0)else0end)fromia_subsidiary例(2):select(casewheniainquantityisnotnulltheniainquantityelse0end)as入库数量fromia_subsidiaryConvert:将某种数据类型的表达式显式转换为另一种数据类型。例:selectCONVERT(char(5),cvoucode)fromia_subsidiaryIsnull:使用指定的替换值替换NULL例:selectisnull(iainquantity,0)fromia_subsidiaryIsdate:确定输入表达式是否为有效的日期,如果输入表达式是有效的日期,那么ISDATE返回1;否则,返回0。下表显示一组示例所得到的返回值例:selectIsdate(dvoudate)fromia_subsidiarySQL语句函数—聚合函数COUNT:返回集合中项目的数量(具体数目取决于集合)。例:selectcount(*)fromaccinformationSUM:返回在某一集合上对数值表达式求得的和。例:selectsum(iquantity)fromso_sodetailsAVG:返回在某一集合上对数值表达式求得的平均值。例:selectavg(iquantity)fromso_sodetailMAX:返回表达式的最大值例:selectmax(iquantity)fromso_sodetailMin:返回在某一集合上对数值表达式求得的最小值例:selectmin(iquantity)fromso_sodetailSQL语句函数—日期函数DATEADD:在向指定日期加上一段时间的基础上,返回新的datetime值。例:selectdateadd(day,0,dsdate)fromrdrecorsGETDATE:按datetime值的SQL标准内部格式返回当前系统日期和时间例:SELECTGETDATE()MONTH:返回代表指定日期月份的整数。例:SELECTmonth(dsdate)fromrdrecordsYEAR:回代表指定日期的年的日期部分的整数例:SELECTyear(dsdate)fromrdrecords:Day:回代表指定日期的天的日期部分的整数例:SELECTday(dsdate)fromrdrecordsSQL语句函数—字符函数CHARINDEX:返回字符串中指定值的起始位置。例:selectcharindex('0',cinvcode)fromrdrecordsLeft:返回从字符串左边开始指定个数的字符。例:selectleft(cinvcode,3)fromrdrecordsRight:返回从字符串右边开始指定个数的字符。例:selectRight(cinvcode,3)fromrdrecordsRtrim:截断所有尾随空格后返回一个字符串。例select(selectleft(csource,8)fromrdrecordwhereid=20)+Rtrim((selectleft(csource,8)fromrdrecordwhereid=27))fromrdrecordwhereid=19Ltrim:删除起始空格后返回字符表达式。例:select(selectleft(csource,8)fromrdrecordwhereid=20)+Ltrim((selectleft(csource,8)fromrdrecordwhereid=27))fromrdrecordwhereid=19Len:返回给定字符串表达式的字符(而不是字节)个数,其中不包含尾随空格例:selectLen(cinvcode)fromrdrecordsSQL语句函数—元函数DB_name:返回数据库名。例:selectdb_name()db_id:返回数据库ID例:selectdb_id(‘ufdata_111_2008')object_id:返回数据库对象标识号例:Selectobject_id(‘ufdata_111_2008)SQL语句多表关联—JOIN内连接 InnerJoin或where中指定(多表查询在指定条件后相当于内连接)外连接 FULLJoin 指定在结果集中包含左表或右表中不满足联接条件的行,并将对应于另一个表的输出列设为NULL。这是对通常由INNERJOIN返回的所有行的补充。 LEFTJoin 指定在结果集中包含左表中所有不满足联接条件的行,且在由内联接返回所有的行之外,将另外一个表的输出列设为NULL。 RIGHTJoin 指定在结果集中包含右表中所有不满足联接条件的行,且在由内联接返回的所有行之外,将与另外一个表对应的输出列设为NULL。逻辑运算AND、OR和NOT等逻辑运算符用在where、on、having、if、case等能够逻辑计算的地方Like、In、EXISTSIN和EXISTS一般使用在内嵌表逻辑运算符的优先顺序是NOT(最高),接着是AND,最后是OR。同一优先级上的取值顺序是从左到右。在搜索条件内,可使用圆括号替代此顺序。例:Like Select*fromrdrecordswherecinvcodelike’%01%’andiquantity=500例:in Select*fromrdrecordswherecinvcodein(‘0101’,’0102’,’0103’)andnotiquantity=500例:EXISTS select*fromia_summarywhereexists(select*fromia_summaryasawhereia_summary.cwhcode=a.cwhcodeandia_summary.cinvcode=a.cinvcodeandia_summary.imonth=a.imonthandia_summary.imonth=2andia_summary.autoid>a.autoid)SQL语句例题:用一条语句写出存货明细账的每个存货的结存数量,要求显示出仓库编码、存货编码、存货名称、结存数量四列(可与存货档案表关联)SQL语句例题:再扩展一下,去与库存对账(不含未记账单据)SQL语句UPDATE、DELETE的使用简单的update、delete语句 Update表名set字段名where条件 Delete表名where条件如更新或删除时条件要在两个表以上取值该如何处理? 写出与表关联后或带有子查询的数据操作语句(想一下在编写SELECT语句时时如何操作的)SQL语句Insert语句无数据来源时 Insertinto表名(列名)values(列值)有数据来源时 Insertinto表名(列名)select列名fron表名where条件请写出以上两个方式的应用的语句视图存储过程视图什么是试图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成表记录。视图的组成 视图是由一个或多个表、视图关联组成,其中不包含存储过程,可以理解为已经编译好的固定的SQL简单查询语句视图存储过程存储过程什么是存储过程 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可,可以视为一个复杂的对数据整理计算的程序。存储过程的组成 由SQL中的试图、表、存储过程及SQL语句等组成视图存储过程分析视图 打开一个视图分析,讨论组织模式和其特点(copyrdlist)存储过程 打开一个存储过程分析其中的组成部分和特点(SP_ClearCurrentStock_ST)跟踪案例分析案例一现象:操作员“AP”具有应付余额表的所有权限,但在查询时点击无响应,也没有任何提示。跟踪案例分析准备跟踪分析思路 该在哪开始跟踪? 出现该现象时做了那些操作,哪些是我可以利用的内容? 操作的单据或节点可能与后台哪些数据表相关? 软件操作时出现的结果属于对后台数据查询还是删改? 根据现象先判断跟踪的语句可能出现什么样的结果(是否会直接有错误提示) 跟踪出的语句应注意查看什么类型的? 找到关键语句后如何分析?跟踪案例分析跟踪跟踪案例分析分析语句不是很多,关键语句是哪个呢? execsp_reset_connection go SetTRANSACTIONISOLATIONLEVELREADCOMMITTED go SELECTcScenarioIDASScenarioIDFROMUA_ScenarioEntryASScenarioEntry,UA_ScenarioASScenarioWHEREScenarioEntry.cScenarioID=Scenario.cIDANDScenarioEntry.cMenu_Id='AP1040202'ANDcIDIN(SELECTcScenarioIDFROMUA_ScenarioGroupWHEREcGroup_IdIN(SELECTcGroup_IdFROMUA_RoleWHEREcUser_Id='AP')) go execsp_reset_connection go select[Name]fromRpt_GlbDEF_Basewhere[Name]=N'应付余额表'andLocaleId='zh-CN'andSystemID='AP'andbNewRpt=0 go SelectID,Name,Title,DefaultTitle,Note,Relation,DatabaseEx,IsBaseTable,*FromRpt_GlbDefWhereName=N'应付余额表' go select*fromRpt_GlbDEFwhere[Name]=N'应付余额表'andSystemID='AP'跟踪案例分析分析去掉一些无用语句,分别执行下面的语句 SELECTcScenarioIDASScenarioIDFROMUA_ScenarioEntryASScenarioEntry,UA_ScenarioASScenarioWHEREScenarioEntry.cScenarioID=Scenario.cIDANDScenarioEntry.cMenu_Id='AP1040202'ANDcIDIN(SELECTcScenarioIDFROMUA_ScenarioGroupWHEREcGroup_IdIN(SELECTcGroup_IdFROMUA_RoleWHEREcUser_Id='AP')) go select[Name]fromRpt_GlbDEF_Basewhere[Name]=N'应付余额表'andLocaleId='zh-CN'andSystemID='AP'andbNewRpt=0 go SelectID,Name,Title,DefaultTitle,Note,Relation,DatabaseEx,IsBaseTable,*FromRpt_GlbDefWhereName=N'应付余额表' go select*fromRpt_GlbDEFwhere[Name]=N'应付余额表'andSystemID='AP'分析关键语句对比 SelectID,Name,Title,DefaultTitle,Note,Relation,DatabaseEx,IsBaseTable,*FromRpt_GlbDefWhereName=N'应付余额表‘ select*fromRpt_GlbDEFwhere[Name]=N'应付余额表'andSystemID='AP‘ 原因是报表上对应的权限丢失了跟踪案例分析案例二现象: 正常单据记账,对发票记账,出现两条一模一样的记录?要求: 跟踪过滤过程,并查找原因。跟踪案例分析准备跟踪分析思路 该在哪开始跟踪? 出现该现象时做了那些操作,哪些是我可以利用的内容? 操作的单据或节点可能与后台哪些数据表相关? 软件操作时出现的结果属于对后台数据查询还是删改? 根据现象先判断跟踪的语句可能出现什么样的结果(是否会直接有错误提示) 跟踪出的语句应注意查看什么类型的? 找到关键语句后如何分析?跟踪案例分析跟踪:跟踪案例分析分析:查看发现跟踪到的语句分析到关键语句发现是通过存储过程调用的,那么看看该存储过程是如何取数的。跟踪案例分析分析查看IA_AccountLoad存储过程因为是对销售发票记账,那么记账来源一定是销售发票,查看这个存储过程发现只有一段语句是与发票的表相关,把该语句单独拿出来执行看看跟踪案例分析分析:执行该段语句,发现过滤到的就是两条记录跟踪案例分析分析可见问题就出现在了SaleBillVouchsIA870这个视图中,打开该视图分析一下跟踪案例分析分析语句中关联了发货单、订单逐一去除关联后结果如何呢? 去掉发货单,发现结果不变 去掉订单的关联,发现记录只有一条了,那么就可以确定问题出现在了订单上了,查看关联的关键字是:isosid、和id两个字段跟踪案例分析分析通过语句得到ISOSID、ID的相关值,发现问题所在原因是ISOSID出现了重复的记录,该问题的原因就找到了