
导读: 在 SQL Server 2000的视图 中一个小小的会带来什么问题呢?下文中将会给大家带来答案。
有些朋友看到这个标题可能会有疑问,难道在视图中使用*符号还有何要注意的地方吗?对于这个问题,我们先不必回答,先看一下例子吧。
我这里,使用的数据库是SqlServer2000自带的Northwind,这样方便大家自己私下里测试。
首先,创建两个视图,视图的脚本如下:
–视图 vCustomersAcreate view vCustomersAasselect CustomerID ,CompanyName,ContactName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Faxfrom dbo.Customersgo
–视图 vCustomersBcreate view vCustomersBasselect * from vCustomersAgo
然后,使用这两个视图查询客户ID为ALFKI的资料,查询语句如下:
select * from vCustomersA where CustomerID = ‘ALFKI’select * from vCustomersB where CustomerID = ‘ALFKI’
查询的结果如下:
一切正常,这个时候,需求发生了变化,我们需要改动vCustomersA,改动后的脚本如下:(为了说明问题,我们只是把CompanyName和ContactName互换一下位置)
–改动后的视图vCustomersAalter view vCustomersAasselect CustomerID ,ContactName,CompanyName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Faxfrom dbo.Customersgo
这个时候,当我们再次使用视图vCustomersB查询客户ID为ALFKI的资料的时候,错误已经悄然来临,你注意到了吗?让我们来看一下这两个视图的查询结果吧, 查询语句如下:
select * from vCustomersA where CustomerID = ‘ALFKI’select * from vCustomersB where CustomerID = ‘ALFKI’
查询的结果发生变化。你注意到数据的异常了吗?使用视图vCustomersB查询的结果出现了错误,CompanyName显示的资料是:Maria Anders,而在视图vCustomersA查询的结果中CompanyName是:Alfreds Futterkiste。我们仅仅是在vCustomersA中互换了两个字段的位置,再次使用vCustomersB查询数据却发生了数据错位的现象,这是什么原因导致的呢?
带着这个问题,让我们去了解一下,何谓视图?在Sql Server2000的帮助文档中是这样描述视图的,定义如下:“视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。”通过这个定义我们可以看出,视图是一个虚拟的表,它仅仅包括视图的定义脚本,查询的内容则是动态的生成。当我们创建了一个视图以后,视图的脚本会保存到当前数据库的系统表syscomments里,我们可以通过系统提供的存储过程:sp_helptext查询得到视图的定义脚本。从定义上看,好像并不能得到我们想要的答案,那么我们就先不管Sql Server2000是如何实现视图的,我们先来解决一下当前的问题(我上面提到的)。可能有些朋友已经知道了解决问题的办法了,那就是把vCustomersB的定义脚本重新执行一下(其实只需要把create换成alter执行一下就可以),脚本如下:
–重新执行一下vCustomersB的定义脚本
alter view vCustomersBasselect * from vCustomersAgo
那么,除了这个方法以外,其实SqlServer2000也提供了一个扩展存储过程sp_refreshview来帮我们做这件事情,调用的脚本如下:
–刷新指定视图的元数据
exec sp_refreshview ‘vCustomersB’
我个人目前就知道这两个办法,不知道,你还有没有其他的办法,有的话可以一起分享一下。
sp_refreshview的功能描述为:“刷新指定视图的元数据。由于视图所依赖的基础对象的更改,视图的持久元数据会过期。”由于sp_refreshview的代码被封装了(没有公开),所以我们看不到它的内部实现,不过看了这个存储过程的描述,你是否对视图有了新的认识呢?
从这里,我们可以看到,当我们使用一个视图查询数据的时候,其实我们是在使用视图的元数据来查询的,当视图依赖的对象发生了变化以后,视图的元数据就需要更新,这样,使用视图时才不会违背我们的意愿。
知道了问题的产生的原因后,那么我们在重新修改一个表或视图的脚本时,我们就需要更新依赖于该对象的视图,否则就会出现意想不到的错误。如何找到依赖于该对象的对象(包括视图,触发器,存储过程)呢?SqlServer2000在该数据库的系统表sysdepends里记录这些依赖关系,所以你可以查询该表获取你想要的信息,但其实,你可以通过使用系统提供的存储过程:sp_depends来获取该对象的所依赖的对象(返回的***个表)以及依赖于该对象的对象(返回的第二个表),脚本如下:
–查询vCustomersA的依赖的对象以及依赖于vCustomersA的对象
exec sp_depends ‘vCustomersA’
查询的结果如下:
注:sp_depends的代码是公开的,有兴趣的可以看一下其实现过程。
到此,你应该明白,当你更新你的表或视图的时候,你还要刷新依赖于这些对象的视图的元数据,即需要调用sp_refreshview来刷新依赖于该对象的视图。但是你在查询依赖于一个表或者视图的对象集合的时候需要注意的一点是,在你更新了一个表或视图之后,那些之前创建的依赖于该表或视图的依赖关系将会丢失(你更新的表或视图所依赖的对象集合不会丢失),用我之前的例子来看,vCustomersB依赖于vCustomersA,那么当我们修改了vCustomersA以后,vCustomersB与vCustomersA之间的依赖关系将会丢失而vCustomersA所依赖的Customers将不会丢失(依赖关系在对象创建或更新时创建,更新时,会把先前的依赖关系删掉)。(调用sp_depends你就可以看出来这种微妙的变化)
希望在你阅读了本文以后,你在使用视图的时候会更加的得心应手,避免错误发生。还有,这篇文章中的内容也不是绝对权威的,而且技术发展的很快,这些技术可能在若段时间之后就会被推翻,所以如果有说的不对的地方,欢迎大家随时给指正。
【编辑推荐】
系统文件有哪些缩写名称?
是英文单词directory(目录)的缩写,主要用来显示一个目录下的文件和子目录。 [功能]显示指定磁盘、目录中的文件和子目录信息,包括文件及子目录所在磁盘的卷标、文件与子目录的名称、每个文件的大小、文件及目录建立的日期时间,以及文件子目录的个数、所占用总字节数以及磁盘上的剩余总空间等信息。 [格式]dir[C:][path][filename][][/o][/s][/p][/w][/a][说明]dir是DOS命令中最常用的一个。 斜杠表示后面的内容是参数。 DOS参数最常用的是以下四个:/p显示信息满一屏时,暂停显示,按任意键后显示下一屏/o排序显示。 o后面可以接不同意义的字母/w只显示文件名目录名,每行五个文件名。 即宽行显示/s将目录及子目录的全部目录文件都显示 是英文makedirectory(创建目录)的缩写[功能]创建一个子目录[格式]md[C:]path[举例]用md建立一个叫做purple的目录 是英文changedirectory(改变目录)的缩写[功能]改变或显示当前目录[格式]cd[C:][path][说明]路径可以使用绝对路径和相对路径两种。 如果只有cd而没有参数,则只显示当前路径。 注意:子目录中一定有两个“特殊目录”,即“.”“..”,其中一点表示当前目录,两点表示上一层目录。 从简单实用的角度来看,我们只要学会逐层进入(cd下一层某目录名),和逐层退出(cd..)就可以解决所有问题。 当然也可以用绝对路径的办法。 [举例]进入我们刚才建立的purple目录 --删除目录[功能]删除空子目录[格式]rd[d:]path[说明]rd是专门删除空子目录的命令。 注意两条:一是不能删除非空目录;二是不能删除当前目录。 [举例]用rd删除purple这个目录 在英文中是复制的意思[功能]复制一个或一组文件到指定的磁盘或目录中[格式]copy[C:][path][][C:][path][说明]复制文件命令基本用法是:“复制源文件名目标文件名”。 如果只写目标路径而不写目标文件名,表示同名复制;否则称为换名复制。 注意换名复制一般不要更改文件扩展名。 [举例]将C:\purple目录的所有文件复制到软盘,可以打如下命令,请注意当前盘与当前路径不同:C:\>copypurpleA:\如果目标盘上已有同名文件,会出现如下提示,“Overwritexxxx(Yes/No/All)”此时回答Y则覆盖当前文件,N则保留,A则覆盖此后的所有文件而不再提问。 是英文delete(删除)的缩写[功能]删除指定磁盘、目录中的一个或一组文件[格式]del[C:][path][说明]这个命令应小心使用。 一旦被删除,将不易恢复。 同样可以采用通配符为删除一类文件。 当利用*.*时,为了安全将给出警告,确定方进行删除工作。 删除过程如没有信息提示,表示已正确删除。 注意这个命令不能删除具有只读、隐含、系统属性的文件;如果指定文件不存在,则出现“Filenotfound”的提示;DOS对误删除的文件可以用UNDELETE外部命令恢复;它只能删文件,不能删目录。 是英文rename(重新命名)的简写[功能]对指定磁盘、目录中的一个文件或一组文件更改名称[格式]ren[C:][path]filename1[]filename2[][说明]改名操作只限于某个文件某组文件的名称,它不会更改文件所在的目录。 如果使用了通配符,则对一批文件进行更名。 [功能]在屏幕上显示文本文件内容命令[格式]type[C:][path][说明]type命令用来在屏幕上快速、简便地显示文本文件的内容,扩展名为TXT的文件是文本文件。 如果用这个命令显示扩展名为EXE或COM等其它文件,输出的结果往往是一些乱七八糟的符号并伴有无规则的响铃声,有时甚至会出现死机现象。 [功能]磁盘格式化[格式][C:][path]formatdrive:[/S][说明]厂家制造的各种磁盘可用来存储各种操作系统下的文件。 不同操作系统的磁盘格式一般是不相同的,是不通用的。 format命令就是使一个新的磁盘可以被DOS操作系统识别,即可存储DOS文件。 这个命令对磁盘的格式化过程,实际上是用DOS规定的信息存储格式对磁盘进行规划的过程。 格式化磁盘时,要清除磁盘上已经存在的所有数据,在磁盘上写上引导记录,划分出文件分配表和根目录,同时,它还要找出磁盘上的所有坏扇区并作上不可使用的标记。 命令参数我们这里只列出了一个:/S。 当使用了这个参数后,磁盘格式化并装入操作系统文件,使之变成引导盘。 相当于format后再进行下一命令:SYS。 ,翻译成中文就是磁盘复制[功能]复制出一个和原来磁盘内容一模一样的磁盘[格式]diskcopy源驱动器名目的驱动器名[说明]它的主要用途就是用来备份。 比如我们的电脑在刚买来时,会随机附带一些设备驱动程序磁盘,这些驱动程序在以后都有可能用到,为防止这些磁盘的损坏,一定要将它们都备份一套,这时,使用diskcopy命令是比较快捷和方便的。 [功能]删除目录树[格式][C:][path]DELTREE[C1:][path1][[C2:][path2][…]][说明]这个命令将整个指定目录树全部消灭,而不管它是否是只读、隐藏与否。 使用应特别小心。 它是一个危险命令。 是memory的缩写[功能]该命令用来查看你的计算机内存有多少,以及内存的使用情况。 [格式]直接键入mem命令 是checkdisk的缩写。 [功能]用来检查你的磁盘的使用情况。 [格式]chkdsk磁盘名[说明]例如要检查A盘使用情况,就输入chkdskA:,检查c盘使用情况,就输入chkdskC:,如果直接输入chkdsk,就检查当前磁盘的使用情况。 [功能]传递系统文件命令。 将DOS的两个隐含的系统和传送到目标磁盘的特定位置上,并将文件复制过去。 完成后,目标盘成为DOS的启动盘。 [格式][C:][path]SYS[C1:][path]d2:[说明]由于这几个文件需要复制到特定位置上,所以用COPY命令完成的复制未必能够启动机器。 能过SYS命令,DOS可以将目标盘已占据特定位置的文件移动,并将系统文件复制到相应位置上。 参数C1 path用来指明系统文件所在目录。 如不指明,则缺省为当前盘的当前目录。 所以这个命令一般要在源盘的根目录进行。 [功能]设定DOS寻找、、文件的所在目录[格式]path=[[drive:]path[;…]]或path[说明]只打path没有参数时,只显示环境变量内容。 有参数时,重新设置path变量。 在没有指定path环境变量时,用户发出的命令,DOS首先判断其是否为内部命令,再查找当前目录中是否有主文件名是该命令的可执行文件,如果均不是,则显示信息“Badcommandorfilename”。 如果发出了指定路径的命令,则在指定径中依次查找,仍找不到则出现上述提示。 [功能]edit命令是一个简单的编辑软件,我们经常用它来编辑一些程序和批处理文件。 [功能]清除显示器屏幕上的内容,使DOS提示符到屏幕左上角。 [格式]cls [功能]显示和设置DOS的系统时间[格式]time[hh[:mm[:ss[]]][功能]显示和设置DOS的系统日期[格式]date[MM-DD-YY] [功能]显示正在运行的DOS系统版本号[格式]ver
薪酬文件信息库的作用是什么?
薪酬文件信息库最主要的作用是对每一个员工的薪酬进行有效的管理以及统计,把这些信息存储起来,进行有效的保存。
WIN7安装vcredist_x86时出现错误
当安装程序安装到:安装程序正在安装ms数据访问组件时,屏幕出现错误提示:command line option syntax error,type command/? for help
然后点确定继续,结果到:安装程序正在安装HTML帮助时,屏幕又出现标题为html help 1.32 update错误警对话框提示:command line option syntax error,type command/? for help
然后我再点确定继续,安装程序开始复制文件,复制完文件后又出现错误提示:无法找到动态连接库(是MDAC的一个组件),于指定路径点确定后安装程序停止运行,让查看安装日志
解决方法:
引起这问题的原因是,SQLServer的安装文件,放在中文目录下.
将SQLServer的安装文件,拷到英文目录,安装就OK
比如将:
D:\软件\Sqlserver
中的软件去掉.
注:
MDAC (Microsoft Data Access Components)是微软数据库访问组件,Netpise和许多利用数据库的软件都需要操作系统安装MDAC。 很多用户的操作系统中已经存在了MDAC,有些是操作系统内置的、有些是其它应用程序安装的。
补充方法(未测试)
1.重装MDAC2.修改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\setup删除ExceptionComponents重启,安装.很多时候不需要 第一步 操作。
在笔记本电脑安装SQL出现错误: command line option syntax error!type command /? for help
一、情况说明
SQL Server 2000以前的版本,例如7.0一般不存在多个版本,只有标准版跟桌面版,用户如果不清楚该装什么版本的话,可按安装上的 安装先决条件指示安装,一般在WIN2000 服务器版上装标准版,其他的系统装桌面版的就可以;而SQL Server 2000安装问题就比较大,时常 见到的问题如下: 1、配置服务器时中断. 2、注册 ActiveX 时中断. 3、显示到100%的时候中断. 4、提示:command line option syntax error, type command /? for help,继续安装,最后在配置服务器的时候出现:无法找到动态链接 于指定的路径…… 5、以前进行的程序创建了挂起的文件操作,运行安装程序前,必须重新启动
二、情况1,2,3的解决办法:
提醒:为避免误操作,先备份注册表和数据库进不了SQL Server 2000,可以备份C:Program Files\Microsoft SQL Server\Mssql\Data (默认路径)文件夹的文件. 1)、先把SQL Server卸载(卸载不掉也没有关系,继续下面的操作); 2)、把Microsoft SQL Server文件夹整个删掉; 3)、运行注册表,删除如下项: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MssqlServer HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MssqlSERVER HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SQLSERVERAGENT HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MssqlSERVERADHELPER HKEY_CURRENT_USER\Software\Microsoft\Microsoft SQL Server 4)、需要的话就重新启动系统; 5)、重新安装。
另外也可尝试单步运行安装 SQL Server 2000的方法:
1)、放入 SQL Server 2000 光盘. 2)、在开始--运行键入 F:\x86\ k=dbg (F是光盘)
注意: 1)、不同的操作系统支持的SQL Server 2000版本(参见:SQL Server 2000 各版本的区别简介及版本情况查询一文)。 Windows 2000 Server可以安装SQL Server 2000的任何版本. Windows 2000 Professional只能安装SQL Server 2000的个人版、开发版、评估版、MCDE 2)、SQL Server 2000各版本以及对软硬件的要求(参见:SQL Server 2000 的硬件和软件安装要求一文)。
三、情况4的解决办法
因为安装文件的路径(完整路径)里有中文. 比如 c:\SQLSERVER中文企业版\ 改成 c:\SQLSERVER\
四、情况5的解决办法
1)、重启机器,再进行安装,如果发现还有该错误,请按下面步骤; 2)、在开始--运行中输入regedIT; 3)、到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager位置找到 PendingFileRenameOperations项目,并删除它。 这样就可以清除安装暂挂项目。 4)、选择文件--倒出,保存; 5)、在右边窗口右击PendingFileRenameOperations,选择删除,然后确认; 6)、重启安装,问题解决
五、如果问题依旧,试试先修复操作系统:

命令提示符下执行: sfc /scannow 。
最后的方法:换 Windows 2000 安装盘和 SQL Server 2000 安装盘,有时候问题的原因很奇怪,有人曾更换了一个电源就解决了问题。
1)、先卸载您的 SQL Server 2000,必要的时候删除 Program Files\Microsoft SQL Server 文件夹; 2)、打开注册表; 在开始--运行键入regedIT3)、按下列顺序点击打开; + HKEY_LOCAL_MACHINE + SOFTWART + Microsoft + Windows + CurrentVersion + Setup+ ExceptionComponents 4)、将 ExceptionComponents 下面的文件夹全部删除; 如 {60BFF50D-FB2C-4498-A577-C9548C390BB9} {60BFF50D-FB2C-4498-A577-C9548C390BB9} {60BFF50D-FB2C-4498-A577-C9548C390BB9} {60BFF50D-FB2C-4498-A577-C9548C390BB9} 5)、重新启动; 6)、重新安装 SQL Server 2000 。
六、其他说明
1)、Windows目录中的文件,该文件列出了安装程序所执行的操作的详细信息,并包含安装期间遇到的所有错误。 通过检查该文件,可以详细了解安装在什么地方失败、为什么失败。
2)、SQL安装的时的错误信息保存在一个叫Errorlog的日志文件中,默认情况下该文件位于Program Files\Microsoft SQL Server\Mssql\Log 目录中。 该错误日志包含安装程序试图启动SQL-Server时SQL-Server所遇到的错误,这些信息可以帮助您深入检查错误原因。
3)、需要检查的另一个组件是Microsoft数据访问组件(MDAC)安装程序,它作为SQL-Server2000安装程序的一部分启动。 SQL-Server2000安装程序会安装MDAC2.6。 MDAC安装程序会创建名为的单独的日志文件;您可以查看此日志文件并确保MDAC 安装程序没有出现问题。
SQL或msde安装问题-Command line option syntax error. Typ
SQL 2000安装问题--Command line option syntax error
当安装程序安装到:安装程序正在安装ms数据访问组件时,屏幕出现错误提示:---------------------------SQL Redist---------------------------Command line option syntax error. Type Command /? for Help.---------------------------确定---------------------------
然后点确定继续,安装程序开始复制文件,复制完文件后又出现错误提示:无法找到动态连接库于指定路径“…\”(超级长的路径!)点确定后安装程序停止运行,查看安装日志。
解决方法:
引起这问题的原因是,SQLServer的安装文件被放在了中文目录下.
将SQLServer的安装文件,拷到英文目录,安装就OK
比如将:
“D:\Sqlserver安装盘”中的安装盘去掉。就行了!
什么?还是不行?!别急,嘿嘿。
看看您的用户名是不是中文的,改成英文的吧。 这个用户名指的就是您登录windows的时候使用的用户名,系统默认的是Administrator。
您不舍的修改这个用户名?那就重新创建一个英文的用户吧,用这个用户登录然后安装就行了。
再多嘴说一说原因吧:软件在安装的时候会先解压,生成一些临时文件,系统调用这些文件进行安装。有时候这些文件放在当前的目录下,有时候放在“C:\Documents and Settings\用户名\Local Settings\Temp”文件夹中,这时候如果您的“用户名”是中文的话,就可能失败了。看来还是支持中文不够好啊!无奈!
发表评论