<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
  <channel>
    <title>SQLServer教程--asp.net教程</title>
    <image>
      <title>sortol.com</title>
      <link>http://www.sortol.com</link>
      <url>http://www.sortol.com/images/logo.gif</url>
    </image>
    <description>SQLServer教程--asp.net教程网</description>
    <link>http://www.sortol.com</link>
    <language>zh-cn</language>
    <generator>www.sortol.com</generator>
    <item>
      <title><![CDATA[Access数据库技巧汇集 - Access，技巧 程序开发 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-12-15/article14870.shtml]]></link>
      <pubDate><![CDATA[2007-12-15]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[
				&nbsp;&nbsp;&nbsp; Access数据库现在是不是过时了呢？现在一般的高校都不开设Access课了。绝大部分的都在开设SQL、oracle等。但是Access数据库还是存在的。所以还有它的可用之处。下面是我收集的一些Access数据库技巧。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 各子系统集成的技巧 
<br>&nbsp;&nbsp;&nbsp; 1、选项组、开关按钮、组合框等控件的运用 <br>&nbsp;&nbsp;&nbsp;&nbsp;在窗体上将这些控件巧妙地加以运用可以有机地将有关系统通过一个窗体来控制，这些控件选择值可以传递到查询、报表及宏中的条件中去，从而使得对查询、报表及宏的控制显得灵活方便。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;2、选项卡控件的运用 <br>&nbsp;&nbsp;&nbsp;&nbsp;在Access 97 版中新增加了“选项卡”控件，这更使Access可以在有限的窗体中集成更多的子系统。比如在“打印表格”窗体中就可集成“成绩表”、“十分段统计表”、单科每分段统计表“等子系统”，每个子系统对应一个标签页。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;3、开关面板窗体的运用 <br>&nbsp;&nbsp;&nbsp;&nbsp;运用开关面板窗体可以将所有的子窗体集成到一起。开关面板窗体可以运用新建一个窗体并在其上放置各命令按钮来集成各子系统窗体的方法来建立。开关面板窗体可以说就是一个系统主窗体，它可以指引用户选择所需进行的操作。我们也可以运用Access中的“开关面板管理器”来建立开关面板窗体。具体方法如下：&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;①单击“工具”、“加载项”，然后单击“开关面板管理器”命令。 <br>&nbsp;&nbsp;&nbsp;&nbsp;②如果 Microsoft Access 询问是否要新建开关面板时，请单击“是”按钮。 <br>&nbsp;&nbsp;&nbsp;&nbsp;③在“开关面板管理器”对话框中，单击“编辑”按钮。 <br>&nbsp;&nbsp;&nbsp;&nbsp;④在“编辑开关面板页面”对话框中的“开关面板名”框中输入开关面板的名称，然后单击“新建”按钮。 <br>&nbsp;&nbsp;&nbsp;&nbsp;⑤在“编辑开关面板项目”对话框的“文本”框中，为第一个开关面板按钮输入相应的文本，然后在“命令”框中单击所需的命令。如在“文本”框中输入“打印表格”，然后单击“命令”框中的“以编辑方式打开窗体”命令。 <br>&nbsp;&nbsp;&nbsp;&nbsp;⑥Microsoft Access 是否会在“命令”框下显示另一方框取决于单击的命令。如果有必要，请单击该方框中的项目。例如，如果在步骤 5&nbsp; 的“命令”框中单击了“以编辑方式打开窗体”命令，可以在“窗体”框中单击要打开的窗体名称，例如“打印表格”，然后单击“确定”按钮。 <br>&nbsp;&nbsp;&nbsp;&nbsp;⑦重复步骤 4 至 6，直到已经在开关面板中添加了所有要添加的项目。如果要编辑或删除项目，可以在“开关面板上的项目”框中单击该项目，然后单击“编辑”或“删除”按钮。如果要重新安排项目，可以在框中单击项目，然后单击“往上移”或“往下移”按钮。 <br>&nbsp;&nbsp;&nbsp;&nbsp;⑧单击“关闭”按钮。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;其它技巧<br><br>&nbsp;&nbsp;&nbsp;&nbsp;1、经常压缩数据库 <br>&nbsp;&nbsp;&nbsp;&nbsp;当对数据库进行了不断的增加、删除对象等修改工作后，数据库可能会变成碎片保存，并且不能有效地使用磁盘空间。定期压缩数据库可以重组文件并释放磁盘空间，提高效率。方法：单击“工具”、“数据库实用工具”、“压缩数据库”命令。据有关资料介绍，新版Access 2000能在每次关闭数据库文件时自动完成这项工作，这将给我们带来很大的方便。 <br>&nbsp;&nbsp;&nbsp;&nbsp;2、多用户下的设置 <br>&nbsp;&nbsp;&nbsp;&nbsp;如果想让数据库在网络上共享，比如在网络上同时由几个人输入、或者修改数据，则必须设置好多用户选项。 <br>&nbsp;&nbsp;&nbsp;&nbsp;设置多用户选项的方法是： <br>&nbsp;&nbsp;&nbsp;&nbsp;①在“工具”菜单上单击“选项”命令。 <br>&nbsp;&nbsp;&nbsp;&nbsp;②单击“高级”选项卡即可进行设置。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;3、加密及生成“.mde”文件 <br>&nbsp;&nbsp;&nbsp;&nbsp;为使数据库系统不被它人破坏，可以加密数据库或将数据库生成为“.mde”文件。将数据库保存为 “.mde” 文件将编译所有模块、删除所有可编辑的源代码并且压缩目标数据库。Visual Basic 程序代码将继续执行，但是不能进行查看或编辑，并且数据库的大小将因程序代码的删除而减少。除此之外，内存将优化使用，这将有助于提高性能。将数据库保存为 “.mde” 文件可防止下列操作：在“设计”视图中查看、修改或创建窗体、报表或模块，不能进行查看或编辑Visual Basic 程序代码。生成 “.mde” 文件的方法是： <br>&nbsp;&nbsp;&nbsp;&nbsp;①关闭数据库。如果正在多用户环境中工作，请确保所有其他用户已经关闭数据库。 <br>&nbsp;&nbsp;&nbsp;&nbsp;②在“工具”菜单上，指向“数据库实用工具”，然后单击“生成 MDE 文件”命令。 <br>&nbsp;&nbsp;&nbsp;&nbsp;③在“保存数据库为 MDE”对话框上，指定要另存为 MDE 文件的数据库，并且单击“生成 MDE”按钮。 <br>&nbsp;&nbsp;&nbsp;&nbsp;④在“保存 MDE 为”对话框上，指定数据库的名称、驱动器以及文件夹。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;结束语<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Access是一个功能强大的数据库管理系统，由于篇幅所限本文就谈到这里，愿这点经验体会能对有兴趣的朋友提供一点帮助。 
			
			 &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[改mdb为asp就能防Access数据库下载是鬼话 程序开发 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-12-15/article14869.shtml]]></link>
      <pubDate><![CDATA[2007-12-15]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[
				&nbsp;&nbsp;&nbsp; 许多程序员在开发的时候都认为改了mdb后缀为asp就能防下载的概念，是错的！后台数据库被下载对于一个 asp+a ccess的网站来说无疑是一场惨绝人寰的灾难。今天找了各方的文章，归纳一下有以下9种办法防止数据库被下载。 
<br>&nbsp;&nbsp;&nbsp; 1.发挥你的想象力 修改数据库文件名不用说，这是最最偷懒的方法，但是若攻击者通过第三方途径获得了数据库的路径），就玩完了。比如说攻击者本来只能拿到list权 ，结果意外看到了数据库路径，就可以冠冕堂皇地把数据库下载回去研究了。另外，数据文件通常大小都比较大，起再隐蔽的文件名都瞒 不了人。故保密性为最低。<br><br>&nbsp;&nbsp;&nbsp; 2.数据库名后缀改为ASA、ASP等<br>&nbsp;&nbsp;&nbsp; 此法须配合一些要进行一些设置，否则就会出现本文开头的那种情况<br>&nbsp;&nbsp;&nbsp; （1）二进制字段添加。<br>&nbsp;&nbsp;&nbsp; （2） 在这个文件中加入&lt;%或%&gt;，IIS就会按ASP语法来解析，然后就会报告500错误，自然不能下载了。可是 如果只是简单的在数据库的文本或者备注字段加入&lt;%是没用的，因为ACCESS会对其中的内容进行处理，在数据库里他会以 &lt; %的形式存在，无效！正确的方法是将 &lt;%存入OLE对象字段里，这样我们的目的就能达到了。操作方法：首先，用notepad新建一个内容为 &lt;% 的&nbsp; 文本文件，随便起个名字存档。接着，用Access打开您的数据库文件，新建一个表，随便起个名字，在表中添加一个OLE对象的字段，然后添加一个记录， 插入之前建立的文本文件，如果操作正确的话，应该可以看到一个新的名为“数据包”的记录。<br><br>&nbsp;&nbsp;&nbsp; 3. 数据库名前加“#”只需要把数据库文件前名加上#、然后修改数据库连接文件（如conn.asp）中的数据库地址。原理是下载的时候只能识别&amp;&nbsp; nbsp；#号前名的部分，对于后面的自动去掉，比如你要下载：http://www.pcdigest.com/date/# 123.mdb（假设存在的话）。无论是 IE还是FLASHGET等下到的都是http://www.test.com/dat e/index.htm （index.asp、 default.jsp等你在IIS设置的首页文档）。另外在数据库文件名中保留一些空格也起到类似作用，由于HTTP协议对地址解析的特殊性，空格会被编码为“%”，如http ://www.test.com/date/123 ；456.mdb，下载的时 http： //www. test.com/date/123 %456.mdb.而我们的目录就根本没有123%456.mdb这个文件，所 以下载也是无效的这样的修改后，即使你暴露了数据库地址，一般情况下别人也是无法下载！<br><br>&nbsp;&nbsp;&nbsp; 4.加密数据库首先在选取“工具-&gt; 安全-&gt;加密/解密数据库，选取数据库（如：employer.mdb），然后接确定，接 着会出现”数据库加密后另存为的窗口，存为：&nbsp; employer1.mdb.接着employer.mdb就会被编码，然后存为 employer1.mdb……要注意的是，以上的动作并不是对数据库设置密码，而只是对数据库文件加以编码，目的是为了防止他 人使用别的工具来查看数据库文件的内容。<br><br>&nbsp;&nbsp;&nbsp; 接下来我们为数据库加密，首先以打开经过编码了的 e mployer1.mdb，在打开时，选择“独占”方式。然后选取功能表的“工具-&gt;安全-&gt;设置数据库密码”， 接着输入密码即可。这样即使他人得到了employer1.mdb文件，没有密码他是无法看到 emplo yer1.mdb 的。<br><br>&nbsp;&nbsp;&nbsp; 加密后要修改数据库连接页， 如：conn.open “driver= {microsoft access driver&amp;nb sp；（*.mdb）}；uid=admin；pwd=数据库密码；dbq=数据库路径”这样修改后，数据库即使被人下载了，别人也无法打开（前提是你的数据库连接页中的密码没有被泄露）。<br><br>&nbsp;&nbsp;&nbsp; 但值得注意的是，由于 Access数据库的加密机制比较简单，即使设置了密码，解密也很容易。该数据库系统通过将用户输入的 密码与某一固定密钥进行“ 异或”来形成一个加密串，并将其存储在*.mdb文件从地址“&amp;H42”开始的区域内。所以一 个好的程序员可以轻松制作一个几十行的小程序就可以轻松地获得任何 Access数据库的密码。因此，只要数据库被下载，其信息安 全依然是个未知数。<br><br>&nbsp;&nbsp;&nbsp; 5. 数据库放在WEB目录外或将数据库连接文件放到其他虚拟目录下如你的WEB目录是e：\webroot，可以把数据库放到e：\data这个文件夹里，在 e：\webroot里的数据库 连接页中修改数据库连接地址为：“……/data/数据库名” 的形式，这样数据库可以正常调用，但是无法下载的，因&nbsp; 为它不在WEB目录里！这个方法一般也不适合购买虚拟空间的用户。<br><br>&nbsp;&nbsp;&nbsp; 6.使用ODBC数据源。&nbsp;<br>&nbsp;&nbsp;&nbsp; 在ASP等程序设计中，如果有条件，应尽量使用ODBC数据源，不要把数据库名写在程序中，否则，数据库名将随ASP源代码 的失密而一同失密，例如： DBPath = Server.MapPath（“……/123/ abc/asfadf.mdb ”）。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; conn.open “driver ={Microsoft Access Driver&amp;nb sp；（*.mdb）}；dbq=”&amp; DBPath可见，即使数据库名字起得再怪异，隐藏的目录再深，ASP源代码失密后，也很容易被下载下来。如果使用ODBC数据源，就不 会存在这样的问题了：&nbsp;&nbsp; conn.open “ODBC-DSN名” ，不过这样是比较烦的，目 录移动的话又要重新设置数据源了，更方便的方法请看第7，8法！<br><br>&nbsp;&nbsp;&nbsp; 7. 添加数据库名的如MDB的扩展映射这个方法就是通过修改IIS设置来实现，适合有IIS控制权的朋友，不适合购买虚拟主机用户（除非管理员已经设置了）。这个 方法我认为是目前最好的。只要修改一处，整个站点的数据库都可以防止被下载。无须修改代码即使暴露目标地址也可以防止下载。&amp;n bsp；我们在IIS属性 ——主目录——配置——映射——应用程序扩展那里添加。mdb文件的应用解析。注意这里的选择的D LL（或EXE等）似乎也不是任意的，选择不当，这个MDB文件还是可以被下载的， 注意最好不要选择选 择asp.dll等。你可以自己多测试下这样修改后下载数据库如：http: //www.test.com/data/dvbbs6.mdb.就出现（404或50 0等错误）<br><br>&nbsp;&nbsp;&nbsp; 8. 使用。net的优越性动网的木鸟就写过一个防非法下载文件的“WBAL 防盗链工具”.具体可以登陆http://www.9seek .com/WBAL/ ；不过 那个只实现了防止非本地下载的 ，没有起到真正的防下载数据库的功能。不过这个方法已经跟5法差 不多可以通过修改。NET文件，实现本地也不能下载！<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 这几个方法中，只有第7和8个是统一性改的，一次修改配置后，整个站点的数据库都可以防止下载，其他几个就要分别修改数据库 名和连接文件，比较麻烦，不过对于虚拟主机的朋友也只能这样了！<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; 其实第6个方法应该是第5个方法的扩展，可以实现特殊的功能，但对于不支持。net的主机或者怕设置麻烦的话，还是直接用第 5个方法了，而且默认情况下第6个方法，依然可以通过复制连接到同主机的论坛或留言本发表，然后就可以点击下载了（因为这样的引 用页是来自同主机的）。 
<br>&nbsp;&nbsp;&nbsp; 9.利用NTFS分区的文件权限设置（by percyboy）&nbsp;<br>&nbsp;&nbsp;&nbsp; 我们已经知道，ASP.NET 中使用 ADO.NET 访问数据库，通过 OleDb 的连接可以访问 Access 数据库— —我们非常常用的低端数据库之一。本文讨论了 ASP.NET 中可能看到的若干错误提示，从中看到&amp;nb sp；Access 2000 和 Access XP&nbsp; 创建的数据库文件 ，在访问出现错误时会出现不太相同的错误提示。希望对大家有所帮助。另一个要点是，希望通过此文，使大家对 ASP. NET 中&nbsp;&nbsp; Access 数据库文件的 NTFS 权限设置有所新的认识。
			
			 &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[分页存储过程 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-29/article10368.shtml]]></link>
      <pubDate><![CDATA[2007-10-29]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>分页存储过程:
<br>classid为分类ID号
<br>pageindex 当前页
<br>pagesize 为页数
<br>CREATE proc W_GetNewsListByClassID&nbsp; <br>@classID int,<br>@pageindex int,<br>@pagesize int<br>as<br>declare @strsql varchar(1000)<br>set @strsql='select top '+str(@pagesize)+<br>'&nbsp;&nbsp; [id] ,[classid] ,[title]&nbsp; ,[pubdate],[hits] ,[recommand] from w_news where ( classID='<br>+str(@classID)+' and [id] not in (select top&nbsp; '+str(@pagesize*(@pageindex-1))+<br>' [id] from w_news where classID='+str(@classID)+'&nbsp;&nbsp;&nbsp; order by [id] desc )) '+<br>'&nbsp;&nbsp; order by [id] desc ' <br>&nbsp;<br>exec (@strsql) &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[学习数据库：如何优化SQL Server数据库查询 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10363.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[优化SQL Server数据库<br>&nbsp;<br>查询速度慢的原因很多，常见如下几种：　　<br>　　1、没有索引或者没有用到索引(这是查询慢最常见的问题，是程序设计的缺陷)　　<br>　　2、I/O吞吐量小，形成了瓶颈效应。　　<br>　　3、没有创建计算列导致查询不优化。　　<br>　　4、内存不足　　<br>　　5、网络速度慢　　<br>　　6、查询出的数据量过大（可以采用多次查询，其他的方法降低数据量）　　<br>　　7、锁或者死锁(这也是查询慢最常见的问题，是程序设计的缺陷)　　<br>　　8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。　　<br>　　9、返回了不必要的行和列　　<br>　　10、查询语句不好，没有优化<br>　　可以通过如下方法来优化查询 :　　<br>　　1、把数据、日志、索引放到不同的I/O设备上，增加读取速度，以前可以将Tempdb应放在RAID0上，SQL2000不在支持。数据量（尺寸）越大，提高I/O越重要.　　<br>　　2、纵向、横向分割表，减少表的尺寸(sp_spaceuse)　　<br>　　3、升级硬件　　<br>　　4、根据查询条件,建立索引,优化索引、优化访问方式，限制结果集的数据量。注意填充因子要适当（最好是使用默认值0）。索引应该尽量小，使用字节数小的列建索引好（参照索引的创建）,不要对有限的几个值的字段建单一索引如性别字段　　<br>　　5、提高网速;　　<br>　　6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存：虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000 时，可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能，并打算运行 Microsoft 搜索服务以便执行全文索引和查询，可考虑：将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍（虚拟内存大小设置的一半）。　　<br>　　7、增加服务器 CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务，就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行，SQL SERVER根据系统的负载情况决定最优的并行等级，复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作Update,Insert， Delete还不能并行处理。　　<br>　　8、如果是使用like进行查询的话，简单的使用index是不行的，但是全文索引，耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时，查询耗时和字段值总长度成正比,所以不能用CHAR类型，而是VARCHAR。对于字段的值很长的建全文索引。　　<br>　　9、DB Server 和APPLication Server 分离；OLTP和OLAP分离　　<br>　　10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器，但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器，以支持大型的多层 Web 站点的处理需要。有关更多信息，参见设计联合数据库服务器。（参照SQL帮助文件'分区视图'）　　<br>　　a、在实现分区视图之前，必须先水平分区表　　<br>　　b、在创建成员表后，在每个成员服务器上定义一个分布式分区视图，并且每个视图具有相同的名称。这样，引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样，但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。　　<br>　　11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长，它会降低服务器的性能。在T-sql的写法上有很大的讲究，下面列出常见的要点：首先，DBMS处理查询计划的过程是这样的：　　<br>　　 1、 查询语句的词法、语法检查　　<br>　　 2、 将语句提交给DBMS的查询优化器　　<br>　　 3、 优化器做代数优化和存取路径的优化　　<br>　　 4、 由预编译模块生成查询规划　　<br>　　 5、 然后在合适的时间提交给系统处理执行　　<br>　　 6、 最后将执行结果返回给用户其次，看一下SQL SERVER的数据存放的结构：一个页面的大小为8K(8060)字节，8个页面为一个盘区，按照B树存放。　　<br>　　12、Commit和rollback的区别 Rollback:回滚所有的事物。 Commit:提交当前的事物. 没有必要在动态SQL里写事物，如果要写请写在外面如： begin tran exec(@s) commit trans 或者将动态SQL 写成函数或者存储过程。　　<br>　　13、在查询Select语句中用Where字句限制返回的行数,避免表扫描,如果返回不必要的数据，浪费了服务器的I/O资源，加重了网络的负担降低性能。如果表很大，在表扫描的期间将表锁住，禁止其他的联接访问表,后果严重。　　<br>　　14、SQL的注释申明对执行没有任何影响<br>　　15、尽可能不使用光标，它占用大量的资源。如果需要row-by-row地执行，尽量采用非光标技术,如：在客户端循环，用临时表，Table变量，用子查询，用Case语句等等。游标可以按照它所支持的提取选项进行分类： 只进 必须按照从第一行到最后一行的顺序提取行。FETCH NEXT 是唯一允许的提取操作,也是默认方式。可滚动性可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大，他的目的是支持循环。有四个并发选项 READ_ONLY：不允许通过游标定位更新(Update)，且在组成结果集的行中没有锁。 OPTIMISTIC WITH valueS:乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形，即在打开游标及更新行的间隔中，只有很小的机会让第二个用户更新某一行。当某个游标以此选项打开时，没有锁控制其中的行，这将有助于最大化其处理能力。如果用户试图修改某一行，则此行的当前值会与最后一次提取此行时获取的值进行比较。如果任何值发生改变，则服务器就会知道其他人已更新了此行，并会返回一个错误。如果值是一样的，服务器就执行修改。选择这个并发选项OPTIMISTIC WITH ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制，其中的表必须具有某种版本标识符，服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server 中，这个性能由 timestamp 数据类型提供，它是一个二进制数字，表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值：@@DBTS。每次以任何方式更改带有 timestamp 列的行时，SQL Server 先在时间戳列中存储当前的 @@DBTS 值，然后增加 @@DBTS 的值。如果某 个表具有 timestamp 列，则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值，从而确定该行是否已更新。服务器不必比较所有列的值，只需比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发，则游标默认为基于数值的乐观并发控制。 SCROLL LOCKS 这个选项实现悲观并发控制。在悲观并发控制中，在把数据库的行读入游标结果集时，应用程序将试图锁定数据库行。在使用服务器游标时，将行读入游标时会在其上放置一个更新锁。如果在事务内打开游标，则该事务更新锁将一直保持到事务被提交或回滚；当提取下一行时，将除去游标锁。如果在事务外打开游标，则提取下一行时，锁就被丢弃。因此，每当用户需要完全的悲观并发控制时，游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁，从而阻止其它任务更新该行。然而，更新锁并不阻止共享锁，所以它不会阻止其它任务读取行，除非第二个任务也在要求带更新锁的读取。滚动锁根据在游标定义的 Select 语句中指定的锁提示，这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取，并保持到下次提取或者游标关闭，以先发生者为准。下次提取时，服务器为新提取中的行获取滚动锁，并释放上次提取中行的滚动锁。滚动锁独立于事务锁，并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关，则 COMMIT 语句并不关闭任何打开的游标，而且滚动锁被保留到提交之后，以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项和游标 Select 语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定 未锁定 更新 NOLOCK 未锁定 未锁定未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 错误 更新 更新 更新 TABLOCKX 错误 未锁定 未锁定更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提示将使指定了该提示的表在游标内是只读的。　　<br>　　16、用Profiler来跟踪查询，得到查询所需的时间，找出SQL的问题所在;用索引优化器优化索引　　<br>　　17、注意UNion和UNion all 的区别。UNION all好　　<br>　　18、注意使用DISTINCT，在没有必要时不要用，它同UNION一样会使查询变慢。重复的记录在查询里是没有问题的　　<br>　　19、查询时不要返回不需要的行、列　　<br>　　20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时，服务器自动取消查询,在查询之前就扼杀掉。 SET LOCKTIME设置锁的时间　　<br>　　21、用select top 100 / 10 Percent 来限制用户返回的行数或者SET ROWCOUNT来限制操作的行　　<br>　　22、在SQL2000以前，一般不要用如下的字句: "IS NULL", "&lt;&gt;", "!=", "!&gt;", "!&lt;", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'"，因为他们不走索引全是表扫描。也不要在Where字句中的列名加函数，如Convert，substring等,如果必须用函数的时候，创建计算列再创建索引来替代.还可以变通写法：Where SUBSTRING(firstname,1,1) = 'm'改为Where firstname like 'm%'（索引扫描），一定要将函数和列名分开。并且索引不能建得太多和太大。NOT IN会多次扫描表，使用EXISTS、NOT EXISTS ，IN , LEFT OUTER JOIN 来替代，特别是左连接,而Exists比IN更快，最慢的是NOT操作.如果列的值含有空，以前它的索引不起作用，现在2000的优化器能够处理了。相同的是IS NULL，"NOT", "NOT EXISTS", "NOT IN"能优化她，而"&lt;&gt;"等还是不能优化，用不到索引。　　<br>　　23、使用Query Analyzer，查看SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源，我们优化的重点是这些慢的地方。　　<br>　　24、如果使用了IN或者OR等时发现查询没有走索引，使用显示申明指定索引： Select * FROM PersonMember (INDEX = IX_Title) Where processid IN ('男'，'女')　　<br>　　25、将需要查询的结果预先计算好放在表中，查询的时候再Select。这在SQL7.0以前是最重要的手段。例如医院的住院费计算。　　<br>　　26、MIN() 和 MAX()能使用到合适的索引。　　<br>　　27、数据库有一个原则是代码离数据越近越好，所以优先选择Default,依次为Rules,Triggers, Constraint（约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束）,Procedure.这样不仅维护工作小，编写程序质量高，并且执行的速度快。　　<br>　　28、如果要插入大的二进制值到Image列，使用存储过程，千万不要用内嵌Insert来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串（尺寸是它的两倍），服务器受到字符后又将他转换成二进制值.存储过程就没有这些动作: 方法：Create procedure p_insert as insert into table(Fimage) values (@image), 在前台调用这个存储过程传入二进制参数，这样处理速度明显改善。　　<br>　　29、Between在某些时候比IN 速度更快,Between能够更快地根据索引找到范围。用查询优化器可见到差别。 select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女' 是一样的。由于in会在比较多次，所以有时会慢些。　　<br>　　30、在必要是对全局或者局部临时表创建索引，有时能够提高速度，但不是一定会这样，因为索引也耗费大量的资源。他的创建同是实际表一样。　　<br>　　31、不要建没有作用的事物例如产生报表时，浪费资源。只有在必要使用事物时使用它。　　<br>　　32、用OR的字句可以分解成多个查询，并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引，用UNION all执行的效率更高.多个OR的字句没有用到索引，改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。　　<br>　　 33、尽量少用视图，它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质：它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时，不要使用指向多个表的视图，直接从表检索或者仅仅包含这个表的视图上读，否则增加了不必要的开销,查询受到干扰.为了加快视图的查询，MsSQL增加了视图索引的功能。　　<br>　　34、没有必要时不要用DISTINCT和ORDER BY，这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION 和UNION ALL一样的道理。　　　<br>　　35、在IN后面值的列表中，将出现最频繁的值放在最前面，出现得最少的放在最后面，减少判断的次数。　　<br>　　36、当用Select INTO时，它会锁住系统表(sysobjects，sysindexes等等)，阻塞其他的连接的存取。创建临时表时用显示申明语句，而不是 select INTO. drop table t_lxh begin tran select * into t_lxh from chineseresume where name = 'XYZ' --commit 在另一个连接中Select * from sysobjects可以看到 Select INTO 会锁住系统表，Create table 也会锁系统表(不管是临时表还是系统表)。所以千万不要在事物内使用它！！！这样的话如果是经常要用的临时表请使用实表，或者临时表变量。　　<br>　　37、一般在GROUP BY 个HAVING字句之前就能剔除多余的行，所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优：select 的Where字句选择所有合适的行，Group By用来分组个统计行，Having字句用来剔除多余的分组。这样Group By 个Having的开销小，查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算，只是分组，那么用Distinct更快　　<br>　　38、一次更新多条记录比分多次更新每次一条快,就是说批处理好　　<br>　　39、少用临时表，尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好　　<br>　　40、在SQL2000下，计算字段是可以索引的，需要满足的条件如下：　　<br>　　a、计算字段的表达是确定的　　<br>　　b、不能用在TEXT,Ntext，Image数据类型　　<br>　　c、必须配制如下选项 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….　　<br>　　41、尽量将数据的处理工作放在服务器上，减少网络的开销，如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句，是控制流语言的集合，速度当然快。反复执行的动态SQL,可以使用临时存储过程，该过程（临时表）被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持，所以不得不将这个工作放在其他的层上而增加网络的开销。SQL2000支持UDFs,现在支持复杂的数学计算，函数的返回值不要太大，这样的开销很大。用户自定义函数象光标一样执行的消耗大量的资源，如果返回大的结果采用存储过程　　<br>　　42、不要在一句话里再三的使用相同的函数，浪费资源,将结果放在变量里再调用更快　　<br>　　43、Select COUNT(*)的效率教低，尽量变通他的写法，而EXISTS快.同时请注意区别： select count(Field of null) from Table 和 select count(Field of NOT null) from Table 的返回值是不同的！！！　　<br>　　44、当服务器的内存够多时，配制线程数量 = 最大连接数+5，这样能发挥最大的效率；否则使用 配制线程数量&lt;最大连接数启用SQL SERVER的线程池来解决,如果还是数量 = 最大连接数+5，严重的损害服务器的性能。　　<br>　　45、按照一定的次序来访问你的表。如果你先锁住表A，再锁住表B，那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你（不经意的）某个存储过程中先锁定表B，再锁定表A，这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好，死锁很难被发现　　<br>　　46、通过SQL Server Performance Monitor监视相应硬件的负载 Memory: Page Faults / sec计数器如果该值偶尔走高，表明当时有线程竞争内存。如果持续很高，则内存可能是瓶颈。<br>　　Process:　　<br>　　1、% DPC Time 指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在运行的为比标准间隔优先权低的间隔)。 由于 DPC 是以特权模式执行的，DPC 时间的百分比为特权时间百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间百分比的平均忙时。　　<br>　　2、%Processor Time计数器　如果该参数值持续超过95%，表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。　　<br>　　3、% Privileged Time 指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式，它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。　　<br>　　4、% User Time表示耗费CPU的数据库操作，如排序，执行aggregate functions等。如果该值很高，可考虑增加索引，尽量使用简单的表联接，水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能，可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%，应考虑增加内存。 注意该参数值是从SQL Server启动后，就一直累加记数，所以运行经过一段时间后，该值将不能反映系统当前值。　　<br>　　47、分析select emp_name form employee where salary &gt; 3000 在此语句中若salary是Float类型的，则优化器对其进行优化为Convert(float,3000)，因为3000是个整数，我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。　　<br>　　48、查询的关联同写的顺序　　<br>　　select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' （A = B ,B = '号码'）　　<br>　　select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' （A = B ,B = '号码'， A = '号码'）　　<br>　　select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' （B = '号码'， A = '号码'）　　<br>　　49、　　<br>　　(1)IF 没有输入负责人代码 THEN code1=0 code2=9999 ELSE code1=code2=负责人代码 END IF 执行SQL语句为: Select 负责人名 FROM P2000 Where 负责人代码&gt;=:code1 AND负责人代码 &lt;=:code2　　<br>　　(2)IF 没有输入负责人代码 THEN 　Select 负责人名 FROM P2000 ELSE code= 负责人代码 Select 负责人代码 FROM P2000 Where 负责人代码=:code END IF 第一种方法只用了一条SQL语句,第二种方法用了两条SQL语句。在没有输入负责人代码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条件; 在输入了负责人代码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运算是最快的查询运算。我们写程序不要怕麻烦　　<br>　　50、关于JOBCN现在查询分页的新方法（如下），用性能优化器分析性能的瓶颈，如果在I/O或者网络的速度上，如下的方法优化切实有效，如果在CPU或者内存上，用现在的方法更好。请区分如下的方法，说明索引越小越好。　　<br>　　begin　　<br>　　DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))　　<br>　　insert into @local_variable (ReferenceID)　　<br>　　select top 100000 ReferenceID from chineseresume order by ReferenceID　　<br>　　select * from @local_variable where Fid &gt; 40 and fid &lt;= 60　　<br>　　end 和<br>　　<br>　　begin　　<br>　　DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20))　　<br>　　insert into @local_variable (ReferenceID)　　<br>　　select top 100000 ReferenceID from chineseresume order by updatedate　　<br>　　select * from @local_variable where Fid &gt; 40 and fid &lt;= 60　　<br>　　end 的不同<br>　　<br>　　begin　　<br>　　create table #temp (FID int identity(1,1),ReferenceID varchar(20))　　<br>　　insert into #temp (ReferenceID)　　<br>　　select top 100000 ReferenceID from chineseresume order by updatedate　　<br>　　select * from #temp where Fid &gt; 40 and fid &lt;= 60 drop table #temp　　<br>　　end<br> &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[ms sql server2005 系统表知多少 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10362.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>sql server 2005系统表详细说明&nbsp;&nbsp;&nbsp;&nbsp; <br>sysaltfiles&nbsp; 主数据库 保存数据库的文件 <br>syscharsets&nbsp; 主数据库字符集与排序顺序<br>sysconfigures 主数据库 配置选项
<br>&nbsp;syscurconfigs 主数据库当前配置选项
<br>&nbsp; sysdatabases 主数据库服务器中的数据库
<br>&nbsp; syslanguages 主数据库语言
<br>&nbsp; syslogins 主数据库 登陆帐号信息
<br>&nbsp;sysoledbusers 主数据库 链接服务器登陆信息
<br>&nbsp; sysprocesses 主数据库进程
<br>&nbsp; sysremotelogins主数据库 远程登录帐号
<br>&nbsp; syscolumns 每个数据库 列
<br>&nbsp; sysconstrains 每个数据库 限制
<br>&nbsp; sysfilegroups 每个数据库 文件组
<br>&nbsp; sysfiles 每个数据库 文件
<br>&nbsp; sysforeignkeys 每个数据库 外部关键字
<br>&nbsp; sysindexs 每个数据库 索引
<br>&nbsp; sysmenbers 每个数据库角色成员
<br>&nbsp; sysobjects 每个数据库所有数据库对象
<br>&nbsp; syspermissions 每个数据库 权限
<br>&nbsp; systypes 每个数据库 用户定义数据类型
<br>&nbsp; sysusers 每个数据库 用户
<br><br>sysaltfiles&nbsp; 页首<br>在特殊情况下，包含与数据库中的文件相对应的行。该表存储在 master 数据库中。
<br>列名 数据类型 描述 <br>fileid&nbsp; smallint&nbsp; 每个数据库的唯一文件标识号。 <br>groupid&nbsp; smallint&nbsp; 文件组标识号。 <br>size&nbsp; int&nbsp; 文件大小（以 8 KB 页为单位）。 <br>maxsize&nbsp; int&nbsp; 最大文件大小（以 8 KB 页为单位）。0 值表示不增长，–1 值表示文件应一直增长到磁盘已满。 <br>growth&nbsp; int&nbsp; 数据库的增长大小。0 值表示不增长。根据状态的值，可以是页数或文件大小的百分比。如果 status 为 0x100000，则 growth 是文件大小的百分比；否则是页数。&nbsp; <br>status&nbsp; int&nbsp; 仅限内部使用。 <br>perf&nbsp; int&nbsp; 保留。 <br>dbid&nbsp; smallint&nbsp; 该文件所属数据库的数据库标识号。 <br>name&nbsp; nchar(128)&nbsp; 文件的逻辑名称。 <br>filename&nbsp; nchar(260)&nbsp; 物理设备的名称，包括文件的完整路径。 
<br>&nbsp;
<br>&gt;syscharsets 页首
<br>每个字符集在表中各占一行，表中还包含定义供 Microsoft? SQL Server? 使用的排序次序。排序次序中的一个在 sysconfigures 中标记为默认排序次序，该次序是实际使用的唯一次序。 
<br>列名 数据类型 描述 <br>type&nbsp; smallint&nbsp; 该行表示的实体类型。1001 是字符集；2001 是排序次序。 <br>id&nbsp; tinyint&nbsp; 字符集或排序次序的唯一 ID。注意排序次序和字符集不能共享相同的 ID 号。保留从 1 到 240 的 ID 范围供 SQL Server 使用。 <br>csid&nbsp; tinyint&nbsp; 如果该行表示字符集，则不使用该字段。如果该行表示排序次序，则该字段是在其上生成排序次序的字符集 ID。假设具有该 ID 的字符集行存在于该表中。 <br>status&nbsp; smallint&nbsp; 内部系统状态信息位。 <br>name&nbsp; sysname&nbsp; 字符集或排序次序的唯一名称。该字段必须只包含字母 A-Z 或 a-z、数字 0 – 9 和下划线 (_)。必须以字母开头。 <br>description&nbsp; nvarchar(255)&nbsp; 字符集或排序次序功能的可选描述。 <br>binarydefinition&nbsp; varbinary(255)&nbsp; 仅限内部使用。 <br>definition&nbsp; image&nbsp; 字符集或排序次序的内部定义。该字段中的数据结构取决于类型。 
<br><br>sysconfigures 页首
<br>用户设置的每个配置选项在表中各占一行。 sysconfigures 包含最近启动 Microsoft? SQL Server? 前定义的配置选项，还包含最近启动后设置的所有动态配置选项。该表只位于 master 数据库中。
<br>列名 数据类型 描述 <br>value&nbsp; int&nbsp; 变量的用户可修改值（仅在已执行 RECONFIGURE 后由 SQL Server 使用）。 <br>config&nbsp; smallint&nbsp; 配置变量号。 <br>comment&nbsp; nvarchar(255)&nbsp; 对配置选项的解释。 <br>status&nbsp; smallint&nbsp; 表示选项状态的位图。可能的值包括： <br>0 = 静态（该设置在服务器重新启动时生效）。<br>1 = 动态（该变量在 RECONFIGURE 语句执行时生效）。<br>2 = 高级（仅当设置了显示高级选项时才显示该变量）。<br>3 = 动态和高级。<br>&nbsp;
<br><br>syscurconfigs 页首
<br>每个当前配置选项各占一项。另外，该表还包含四个描述配置结构的项。 syscurconfigs 在由用户查询时动态生成。有关更多信息，请参见 sysconfigures。
<br>列名 数据类型 描述 <br>value&nbsp; int&nbsp; 用户可修改的变量值（仅在已执行 RECONFIGURE 的情况下由 Microsoft? SQL Server? 使用）。 <br>config&nbsp; smallint&nbsp; 配置变量号。 <br>comment&nbsp; nvarchar(255)&nbsp; 对配置选项的解释。 <br>status&nbsp; smallint&nbsp; 表示选项状态的位图。可能的值包括： <br>0 = 静态（该设置在服务器重新启动时生效）。<br>1 = 动态（该变量在 RECONFIGURE 语句执行时生效）。<br>2 = 高级（仅当设置了显示高级选项时才显示该变量）。<br>3 = 动态和高级。<br>&nbsp;
<br>&nbsp;
<br>sysdatabases 页首
<br>Microsoft? SQL Server? 上的每个数据库在表中占一行。最初安装 SQL Server 时， sysdatabases 包含 master 、 model 、 msdb 、 mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。
<br>列名 数据类型 描述 <br>name&nbsp; sysname&nbsp; 数据库的名称。 <br>dbid&nbsp; smallint&nbsp; 数据库 ID。 <br>sid&nbsp; varbinary(85)&nbsp; 数据库创建者的系统 ID。 <br>mode&nbsp; smallint&nbsp; 用于创建数据库时在内部锁定该数据库。 <br>status&nbsp; int&nbsp; 状态位，其中某些状态位可由用户使用 sp_dboption （ read only 、 dbo use only 、 single user 等）进行设置： <br>1 = autoclose ；使用 sp_dboption 设置。<br>4 = select into/bulkcopy ；使用 sp_dboption 设置。<br>8 = trunc. log on chkpt ；使用 sp_dboption 设置。<br>16 = torn page detection ，使用 sp_dboption 设置。<br>32 = loading 。<br>64 = pre recovery 。<br>128 = recovering 。<br>256 = not recovered 。<br>512 = offline ；使用 sp_dboption 设置。<br>1024 = read only ；使用 sp_dboption 设置。<br>2048 = dbo use only ；使用<br>sp_dboption 设置。<br>4096 = single user ；使用 sp_dboption 设置。<br>32768 = emergency mode 。 <br>4194304 = autoshrink 。 <br>1073741824 = cleanly shutdown 。
<br>可以同时打开多个位。<br>&nbsp;<br>status2&nbsp; int&nbsp; 16384 = ANSI null default ；使用 sp_dboption 设置。<br>65536 = concat null yields null ，使用 sp_dboption 设置。<br>131072 = recursive triggers ，使用 sp_dboption 设置。<br>1048576 = default to local cursor ，使用 sp_dboption 设置。<br>8388608 = quoted identifier ，使用<br>sp_dboption 设置。<br>33554432 = cursor close on commit ，使用 sp_dboption 设置。<br>67108864 = ANSI nulls ，使用 sp_dboption 设置。<br>268435456 = ANSI warnings ，使用 sp_dboption 设置。<br>536870912 = full text enabled ，使用 <br>sp_fulltext_database 设置。 <br>crdate&nbsp; datetime&nbsp; 创建日期。 <br>reserved&nbsp; datetime&nbsp; 留作以后使用。 <br>category&nbsp; int&nbsp; 包含用于复制的信息位图： <br>1 = 已发布。<br>2 = 已订阅。<br>4 = 合并已发布。<br>8 = 合并已订阅。<br>&nbsp;<br>cmptlevel&nbsp; tinyint&nbsp; 数据库的兼容级别。有关更多信息，请参见 sp_dbcmptlevel。&nbsp; <br>filename&nbsp; nvarchar(260)&nbsp; 数据库主文件的操作系统路径和名称。 <br>version&nbsp; smallint&nbsp; 创建数据库时使用的 SQL Server 代码内部版本号。仅供 SQL Server 工具在内部用于升级处理。 
<br>&nbsp;
<br>syslanguages 页首
<br>出现在 Microsoft? SQL Server? 中的每种语言在表中各占一行。虽然美国英语不在 syslanguages 内，但该表始终可由 SQL Server 使用。该表只存储在 master 数据库中。
<br>列名 数据类型 描述 <br>langid&nbsp; smallint&nbsp; 唯一语言 ID。 <br>dateformat&nbsp; nchar(3)&nbsp; 日期顺序（如 DMY）。 <br>datefirst&nbsp; tinyint&nbsp; 一周的第一天：1 表示星期一，2 表示星期二，依此类推，直到 7 表示星期日。 <br>upgrade&nbsp; int&nbsp; 留作系统使用。 <br>name&nbsp; sysname&nbsp; 正式语言名称（例如，fran?ais）。 <br>alias&nbsp; sysname&nbsp; 备用语言名称（如 French）。 <br>months&nbsp; nvarchar(372)&nbsp; 按从一月到十二月的顺序排列的用逗号分隔的月份全称列表，每个名称最多包含 20 个字符。 <br>shortmonths&nbsp; varchar(132)&nbsp; 按从一月到十二月的顺序排列的用逗号分隔的缩写月份名称列表，每个名称最多包含 9 个字符。 <br>days&nbsp; nvarchar(217)&nbsp; 按从一月到十二月的顺序排列的用逗号分隔的天名称列表，每个名称最多包含 30 个字符。 <br>lcid&nbsp; int&nbsp; 此种语言的 Microsoft Windows NT? 区域设置 ID。 <br>mslangid&nbsp; smallint&nbsp; SQL Server 消息组 ID。 
<br>&nbsp;
<br>安装了 SQL Server 提供的三十三种语言。下面是语言列表。
<br>用英语表示的名称 NT LCID SQL Server 消息组 ID <br>English 1033 1033 <br>German 1031 1031 <br>French 1036 1036 <br>Japanese 1041 1041 <br>Danish 1030 1030 <br>Spanish 3082 3082 <br>Italian 1040 1040 <br>Dutch 1043 1043 <br>Norwegian 2068 2068 <br>Portuguese 2070 2070 <br>Finnish 1035 1035 <br>Swedish 1053 1053 <br>Czech 1029 1029 <br>Hungarian 1038 1038 <br>Polish 1045 1045 <br>Romanian 1048 1048 <br>Croatian 1050 1050 <br>Slovak 1051 1051 <br>Slovene 1060 1060 <br>Greek 1032 1032 <br>Bulgarian 1026 1026 <br>Russian 1049 1049 <br>Turkish 1055 1055 <br>British English 2057 1033 <br>Estonian 1061 1061 <br>Latvian 1062 1062 <br>Lithuanian 1063 1063 <br>Brazilian 1046 1046 <br>Traditional Chinese 1028 1028 <br>Korean 1042 1042 <br>Simplified Chinese 2052 2052 <br>Arabic 1025 1025 <br>Thai 1054 1054 
<br><br>syslogins 页首
<br>每个登录帐户在表中占一行。 
<br>列名 数据类型 描述 <br>sid&nbsp; varbinary(85)&nbsp; 安全标识符。 <br>status&nbsp; smallint&nbsp; 仅限内部使用。 <br>createdate&nbsp; datetime&nbsp; 添加登录的日期。 <br>updatedate&nbsp; datetime&nbsp; 更新登录的日期。 <br>accdate&nbsp; datetime&nbsp; 仅限内部使用。 <br>totcpu&nbsp; int&nbsp; 仅限内部使用。 <br>totio&nbsp; int&nbsp; 仅限内部使用。 <br>spacelimit&nbsp; int&nbsp; 仅限内部使用。 <br>timelimit&nbsp; int&nbsp; 仅限内部使用。 <br>resultlimit&nbsp; int&nbsp; 仅限内部使用。 <br>name&nbsp; varchar(30)&nbsp; 用户的登录 ID。 <br>dbname&nbsp; nvarchar(128)&nbsp; 建立连接时，用户的默认数据库名。 <br>password&nbsp; nvarchar(128)&nbsp; 用户的加密密码（可以是 NULL）。 <br>language&nbsp; nvarchar(128)&nbsp; 用户的默认语言。 <br>denylogin&nbsp; int&nbsp; 如果登录是 Microsoft? Windows NT? 用户或组且已被拒绝访问，则为 1。 <br>hasaccess&nbsp; int&nbsp; 如果已授权登录访问服务器，则为 1。 <br>isntname&nbsp; int&nbsp; 如果登录是 Windows NT 用户或组，则为 1；如果登录是 Microsoft SQL Server? 登录，则为 0。 <br>isntgroup&nbsp; int&nbsp; 如果登录是 Windows NT 组，则为 1。 <br>isntuser&nbsp; int&nbsp; 如果登录是 Windows NT 用户，则为 1。 <br>sysadmin&nbsp; int&nbsp; 如果登录是 sysadmin 服务器角色成员，则为 1。 <br>securityadmin&nbsp; int&nbsp; 如果登录是 securityadmin 服务器角色成员，则为 1。 <br>serveradmin&nbsp; int&nbsp; 如果登录是 serveradmin 固定服务器角色成员，则为 1。 <br>setupadmin&nbsp; int&nbsp; 如果登录是 setupadmin 固定服务器角色成员，则为 1。 <br>processadmin&nbsp; int&nbsp; 如果登录是 processadmin 固定服务器角色成员，则为 1。 <br>diskadmin&nbsp; int&nbsp; 如果登录是 diskadmin 固定服务器角色成员，则为 1。 <br>dbcreator&nbsp; int&nbsp; 如果登录是 dbcreator 固定服务器角色成员，则为 1。 <br>loginname&nbsp; nvarchar(128)&nbsp; 登录的实际名称，该名称可能不同于 SQL Server 所使用的登录名。 
<br><br>sysoledbusers 页首
<br>每个指定的链接服务器的用户和密码映射在表中占一行。该表存储在 master 数据库中。
<br>列名 数据类型 描述 <br>rmtsrvid&nbsp; smallint&nbsp; 服务器的 SID（安全标识号）。 <br>rmtloginame&nbsp; nvarchar(128)&nbsp; loginsid 映射到的链接 rmtservid 的远程登录名。 <br>rmtpassword&nbsp; nvarchar(128)&nbsp; 链接 rmtsrvid 内的指定远程登录的加密密码。 <br>loginsid&nbsp; varbinary(85)&nbsp; 要映射的本地登录 SID。 <br>status&nbsp; smallint&nbsp; 如果该值为 1，映射应使用用户自己的凭据。 <br>changedate&nbsp; datetime&nbsp; 上次更改映射信息的日期。 
<br>&nbsp;
<br><br>sysprocesses&nbsp; 页首
<br>sysprocesses 表中保存关于运行在 Microsoft? SQL Server? 上的进程的信息。这些进程可以是客户端进程或系统进程。 sysprocesses 只存储在 master 数据库中。
<br>列名 数据类型 描述 <br>spid&nbsp; smallint&nbsp; SQL Server 进程 ID。 <br>kpid&nbsp; smallint&nbsp; Microsoft Windows NT 4.0? 线程 ID。 <br>blocked&nbsp; smallint&nbsp; 分块进程的进程 ID ( spid )。 <br>waittype&nbsp; binary(2)&nbsp; 保留。 <br>waittime&nbsp; int&nbsp; 当前等待时间（以毫秒为单位）。当进程不处于等待时，为 0。 <br>lastwaittype&nbsp; nchar(32)&nbsp; 表示上次或当前等待类型名称的字符串。 <br>waitresource&nbsp; nchar(32)&nbsp; 锁资源的文本化表示法。 <br>dbid&nbsp; smallint&nbsp; 当前正由进程使用的数据库 ID。 <br>uid&nbsp; smallint&nbsp; 执行命令的用户 ID。 <br>cpu&nbsp; int&nbsp; 进程的累计 CPU 时间。无论 SET STATISTICS TIME ON 选项是 ON 还是 OFF，都为所有进程更新该条目。 <br>physical_io&nbsp; int&nbsp; 进程的累计磁盘读取和写入。 <br>memusage&nbsp; int&nbsp; 当前分配给该进程的过程高速缓存中的页数。一个负数，表示进程正在释放由另一个进程分配的内存。 <br>login_time&nbsp; datetime&nbsp; 客户端进程登录到服务器的时间。对于系统进程，是存储 SQL Server 启动发生的时间。 <br>last_batch&nbsp; datetime&nbsp; 客户端进程上次执行远程存储过程调用或 EXECUTE 语句的时间。对于系统进程，是存储 SQL Server 启动发生的时间。 <br>ecid&nbsp; smallint&nbsp; 用于唯一标识代表单个进程进行操作的子线程的执行上下文 ID。 <br>open_tran&nbsp; smallint&nbsp; 进程的打开事务数。 <br>status&nbsp; nchar(30)&nbsp; 进程 ID 状态（如运行、休眠等）。 <br>sid&nbsp; binary(85)&nbsp; 用户的全局唯一标识符 (GUID)。 <br>hostname&nbsp; nchar(128)&nbsp; 工作站的名称。 <br>program_name&nbsp; nchar(128)&nbsp; 应用程序的名称。 <br>hostprocess&nbsp; nchar(8)&nbsp; 工作站进程 ID 号。 <br>cmd&nbsp; nchar(16)&nbsp; 当前正在执行的命令。 <br>nt_domain&nbsp; nchar(128)&nbsp; 客户端的 Windows NT 4.0 域（如果使用 Windows 身份验证）或信任连接的 Windows NT 4.0 域。 <br>nt_username&nbsp; nchar(128)&nbsp; 进程的 Windows NT 4.0用户名（如果使用 Windows 身份验证）或信任连接的 Windows NT 4.0 用户名。 <br>net_address&nbsp; nchar(12)&nbsp; 指派给每个用户工作站上的网络接口卡唯一标识符。当用户登录时，该标识符插入 net_address 列。 <br>net_library&nbsp; nchar(12)&nbsp; 用于存储客户端网络库的列。每个客户端进程都在网络连接上进入。网络连接有一个与这些进程关联的网络库，该网络库使得这些进程可以建立连接。有关更多信息，请参见客户端和服务器 Net-Library。 <br>loginame&nbsp; nchar(128)&nbsp; 登录名。 
<br><br>sysremotelogins 页首
<br>每个允许调用 Microsoft? SQL Server? 上的远程存储过程的远程用户占一行。
<br>列名 数据类型 描述 <br>remoteserverid&nbsp; smallint&nbsp; 远程服务器标识。 <br>remoteusername&nbsp; nvarchar(128)&nbsp; 远程服务器上的用户登录名。 <br>status&nbsp; smallint&nbsp; 选项的位图。 <br>sid&nbsp; varbinary(85)&nbsp; Microsoft Windows NT? 用户安全 ID。 <br>changedate&nbsp; datetime&nbsp; 添加远程用户的日期和时间。 
<br><br>syscolumns 页首
<br>每个表和视图中的每列在表中占一行，存储过程中的每个参数在表中也占一行。该表位于每个数据库中。
<br>列名 数据类型 描述 <br>name&nbsp; sysname&nbsp; 列名或过程参数的名称。 <br>id&nbsp; int&nbsp; 该列所属的表对象 ID，或与该参数关联的存储过程 ID。 <br>xtype&nbsp; tinyint&nbsp; systypes 中的物理存储类型。 <br>typestat&nbsp; tinyint&nbsp; 仅限内部使用。 <br>xusertype&nbsp; smallint&nbsp; 扩展的用户定义数据类型 ID。 <br>length&nbsp; smallint&nbsp; systypes 中的最大物理存储长度。 <br>xprec&nbsp; tinyint&nbsp; 仅限内部使用。 <br>xscale&nbsp; tinyint&nbsp; 仅限内部使用。 <br>colid&nbsp; smallint&nbsp; 列或参数 ID。 <br>xoffset&nbsp; smallint&nbsp; 仅限内部使用。 <br>bitpos&nbsp; tinyint&nbsp; 仅限内部使用。 <br>reserved&nbsp; tinyint&nbsp; 仅限内部使用。 <br>colstat&nbsp; smallint&nbsp; 仅限内部使用。 <br>cdefault&nbsp; int&nbsp; 该列的默认值 ID。 <br>domain&nbsp; int&nbsp; 该列的规则或 CHECK 约束 ID。 <br>number&nbsp; smallint&nbsp; 过程分组时（0 表示非过程项）的子过程号。 <br>colorder&nbsp; smallint&nbsp; 仅限内部使用。 <br>autoval&nbsp; varbinary(255)&nbsp; 仅限内部使用。 <br>offset&nbsp; smallint&nbsp; 该列所在行的偏移量；如果为负，表示可变长度行。 <br>status&nbsp; tinyint&nbsp; 用于描述列或参数属性的位图： <br>0x08 = 列允许空值。<br>0x10 = 当添加 varchar 或 varbinary 列时，ANSI 填充生效。保留 varchar 列的尾随空格，保留 varbinary 列的尾随零。<br>0x40 = 参数为 OUTPUT 参数。<br>0x80 = 列为标识列。<br>&nbsp;<br>type&nbsp; tinyint&nbsp; systypes 中的物理存储类型。 <br>usertype&nbsp; smallint&nbsp; systypes 中的用户定义数据类型 ID。 <br>printfmt&nbsp; varchar(255)&nbsp; 仅限内部使用。 <br>prec&nbsp; smallint&nbsp; 该列的精度级别。 <br>scale&nbsp; int&nbsp; 该列的小数位数。 <br>iscomputed&nbsp; int&nbsp; 表示是否已计算该列的标志： <br>0 = 未计算。<br>1 = 已计算。<br>&nbsp;<br>isoutparam&nbsp; int&nbsp; 表示该过程参数是否是输出参数： <br>1 = 真。<br>0 = 假。<br>&nbsp;<br>isnullable&nbsp; int&nbsp; 表示该列是否允许空值： <br>1 = 真。<br>0 = 假。<br>&nbsp;
<br><br>sysconstraints 页首
<br>包含约束映射，映射到拥有该约束的对象。该系统目录存储在每个数据库中。
<br>列名 数据类型 描述 <br>constid&nbsp; int&nbsp; 约束号。 <br>id&nbsp; int&nbsp; 拥有该约束的表 ID。 <br>colid&nbsp; smallint&nbsp; 在其上定义约束的列 ID，如果是表约束则为 0。 <br>spare1&nbsp; tinyint&nbsp; 保留。 <br>status&nbsp; int&nbsp; 位图指示状态。可能的值包括： <br>1 = PRIMARY KEY 约束。<br>2 = UNIQUE KEY 约束。<br>3 = FOREIGN KEY 约束。<br>4 = CHECK 约束。<br>5 = DEFAULT 约束。<br>16 = 列级约束。<br>32 = 表级约束。<br>&nbsp;<br>actions&nbsp; int&nbsp; 保留。 <br>error&nbsp; int&nbsp; 保留。 
<br><br>sysfilegroups 页首
<br>数据库中的每个文件组在表中占一行。该表存储在每个数据库中。在该表中至少有一项用于主文件组。
<br>列名 数据类型 描述 <br>groupid&nbsp; smallint&nbsp; 每个数据库的唯一组标识号。 <br>allocpolicy&nbsp; smallint&nbsp; 保留。 <br>status&nbsp; int&nbsp; 0x8 = READ ONLY<br>0x10 = DEFAULT <br>groupname&nbsp; sysname&nbsp; 文件组的名称。 
<br><br>sysfiles 页首
<br>数据库中的每个文件在表中占一行。该系统表是虚拟表，不能直接更新或修改。
<br>列名 数据类型 描述 <br>fileid&nbsp; smallint&nbsp; 每个数据库的唯一文件标识号。 <br>groupid&nbsp; smallint&nbsp; 文件组标识号。 <br>size&nbsp; int&nbsp; 文件大小（以 8 KB 页为单位）。 <br>maxsize&nbsp; int&nbsp; 最大文件大小（以 8 KB 页为单位）。0 值表示不增长，–1 值表示文件应一直增长到磁盘已满。 <br>growth&nbsp; int&nbsp; 数据库的增长大小。0 值表示不增长。根据状态的值，可以是页数或文件大小的百分比。如果 status 包含 0x100000，则 growth 是文件大小的百分比；否则，它是页数。 <br>status&nbsp; int&nbsp; growth 值（以兆字节 (MB) 或千字节 (KB) 为单位）的状态位。 <br>0x1 = 默认设备。<br>0x2 = 磁盘文件。<br>0x40 = 日志设备。<br>0x80 = 自上次备份后已写入文件。<br>0x4000 = 由 CREATE DATABASE 语句<br>隐性创建的设备。<br>0x8000 = 在数据库创建过程中创建的设备。<br>0x100000 = 按百分比而不是按页数增长。 <br>&nbsp;<br>perf&nbsp; int&nbsp; 保留。 <br>name&nbsp; nchar(128)&nbsp; 文件的逻辑名称。 <br>filename&nbsp; nchar(260)&nbsp; 物理设备的名称，包括文件的完整路径。 
<br><br>sysforeignkeys 页首
<br>包含关于表定义中的 FOREIGN KEY 约束的信息。该表存储在每个数据库中。
<br>列名 数据类型 描述 <br>constid&nbsp; int&nbsp; FOREIGN KEY 约束的 ID。 <br>fkeyid&nbsp; int&nbsp; 具有 FOREIGN KEY 约束的表对象 ID。 <br>rkeyid&nbsp; int&nbsp; 在 FOREIGN KEY 约束中引用的表对象 ID。 <br>fkey&nbsp; smallint&nbsp; 正在引用的列 ID。 <br>rkey&nbsp; smallint&nbsp; 已引用的列 ID。 <br>keyno&nbsp; smallint&nbsp; 该列在引用列列表中的位置。 
<br><br>sysindexes 页首
<br>数据库中的每个索引和表在表中各占一行。该表存储在每个数据库中。
<br>列名 数据类型 描述 <br>id&nbsp; int&nbsp; 表 ID（如果 indid = 0 或 255）。否则为索引所属表的 ID。 <br>status&nbsp; int&nbsp; 内部系统状态信息。 <br>first&nbsp; binary(6)&nbsp; 指向第一页或根页的指针。 <br>indid&nbsp; smallint&nbsp; 索引 ID： <br>1 = 聚集索引<br>&gt;1 = 非聚集<br>255 = 具有 text 或 image 数据的表条目<br>&nbsp;<br>root&nbsp; binary(6)&nbsp; 如果 indid &gt;= 1 和 &lt; 255， root 是指向根页的指针。如果 indid = 0 或 indid = 255， root 是指向最后一页的指针。&nbsp; <br>minlen&nbsp; smallint&nbsp; 最小行大小。 <br>keycnt&nbsp; smallint&nbsp; 键的数目。 <br>groupid&nbsp; smallint&nbsp; 在其上创建对象的文件组 ID。 <br>dpages&nbsp; int&nbsp; 如果 indid = 0 或 indid = 1， dpages 是已用数据页的计数。如果 indid = 255，其设置为 0。否则是已用索引页的计数。 <br>reserved&nbsp; int&nbsp; 如果 indid = 0 或 indid = 1， reserved 是分配给所有索引和表数据的页计数。如果 indid = 255， reserved 是分配给 text 或 image 数据的页计数。否则是分配给索引的页计数。 <br>used&nbsp; int&nbsp; 如果 indid = 0 或 indid = 1， used 是用于所有索引和表数据的总页数。如果 indid = 255， used 是用于 text 或 image 数据的页计数。否则是用于索引的页计数。 <br>rowcnt&nbsp; bigint&nbsp; 基于 indid = 0 和 indid = 1 的数据级行计数。如果 indid = 255， rowcnt 设置为 0。 <br>rowmodctr&nbsp; int&nbsp; 对自上次更新表的统计后插入、删除或更新行的总数进行计数。 <br>xmaxlen&nbsp; smallint&nbsp; 最大行大小。 <br>maxirow&nbsp; smallint&nbsp; 最大非叶索引行大小。 <br>OrigFillFactor&nbsp; tinyint&nbsp; 创建索引时使用的起始填充因子值。不保留该值；然而，如果需要重新创建索引但记不住当初使用的填充因子，则该值可能很有帮助。 <br>reserved1&nbsp; tinyint&nbsp; 保留。 <br>reserved2&nbsp; int&nbsp; 保留。 <br>FirstIAM&nbsp; binary(6)&nbsp; 保留。 <br>impid&nbsp; smallint&nbsp; 保留。索引实现标志。 <br>lockflags&nbsp; smallint&nbsp; 用于约束经过考虑的索引锁粒度。例如，对于本质上是只读的查找表，可以将其设置为仅进行表级锁定以使锁定成本减到最小。 <br>pgmodctr&nbsp; int&nbsp; 保留。 <br>keys&nbsp; varbinary(816)&nbsp; 组成索引键的列 ID 列表。 <br>name&nbsp; sysname&nbsp; 表名（如果 indid = 0 或 255）。否则为索引的名称。 <br>statblob&nbsp; image&nbsp; 统计 BLOB。 <br>maxlen&nbsp; int&nbsp; 保留。 <br>rows&nbsp; int&nbsp; 基于 indid = 0 和 indid = 1的数据级行数，该值对于 indid &gt;1 重复。如果 indid = 255， rows 设置为 0。提供该列是为了向后兼容。 
<br><br>sysmembers&nbsp; 页首<br>每个数据库角色成员在表中占一行。该表存储在每个数据库中。
<br>列名 数据类型 描述 <br>memberuid&nbsp; smallint&nbsp; 角色成员的用户 ID。 <br>groupuid&nbsp; smallint&nbsp; 角色的用户 ID。 
<br><br>sysobjects 页首<br>在数据库内创建的每个对象（约束、默认值、日志、规则、存储过程等）在表中占一行。只有在 tempdb 内，每个临时对象才在该表中占一行。
<br>列名 数据类型 描述 <br>name&nbsp; sysname&nbsp; 对象名。 <br>Id&nbsp; int&nbsp; 对象标识号。 <br>xtype&nbsp; char(2)&nbsp; 对象类型。可以是下列对象类型中的一种： <br>C = CHECK 约束<br>D = 默认值或 DEFAULT 约束<br>F = FOREIGN KEY 约束<br>L = 日志<br>FN = 标量函数<br>IF = 内嵌表函数<br>P = 存储过程<br>PK = PRIMARY KEY 约束（类型是 K）<br>RF = 复制筛选存储过程<br>S = 系统表<br>TF = 表函数<br>TR = 触发器<br>U = 用户表<br>UQ = UNIQUE 约束（类型是 K）<br>V = 视图<br>X = 扩展存储过程<br>&nbsp;<br>uid&nbsp; smallint&nbsp; 所有者对象的用户 ID。 <br>info&nbsp; smallint&nbsp; 保留。仅限内部使用。 <br>status&nbsp; int&nbsp; 保留。仅限内部使用。 <br>base_schema_<br>ver&nbsp; int&nbsp; 保留。仅限内部使用。 <br>replinfo&nbsp; int&nbsp; 保留。供复制使用。 <br>parent_obj&nbsp; int&nbsp; 父对象的对象标识号（例如，对于触发器或约束，该标识号为表 ID）。 <br>crdate&nbsp; datetime&nbsp; 对象的创建日期。 <br>ftcatid&nbsp; smallint&nbsp; 为全文索引注册的所有用户表的全文目录标识符，对于没有注册的所有用户表则为 0。&nbsp; <br>schema_ver&nbsp; int&nbsp; 版本号，该版本号在每次表的架构更改时都增加。 <br>stats_schema_<br>ver&nbsp; int&nbsp; 保留。仅限内部使用。 <br>type&nbsp; char(2)&nbsp; 对象类型。可以是下列值之一： <br>C = CHECK 约束 <br>D = 默认值或 DEFAULT 约束<br>F = FOREIGN KEY 约束 <br>FN = 标量函数<br>IF = 内嵌表函数<br>K = PRIMARY KEY 或 UNIQUE 约束 <br>L = 日志<br>P = 存储过程<br>R = 规则<br>RF = 复制筛选存储过程<br>S = 系统表 <br>TF = 表函数<br>TR = 触发器<br>U = 用户表<br>V = 视图<br>X = 扩展存储过程<br>&nbsp;<br>userstat&nbsp; smallint&nbsp; 保留。 <br>sysstat&nbsp; smallint&nbsp; 内部状态信息。 <br>indexdel&nbsp; smallint&nbsp; 保留。 <br>refdate&nbsp; datetime&nbsp; 留作以后使用。 <br>version&nbsp; int&nbsp; 留作以后使用。 <br>deltrig&nbsp; int&nbsp; 保留。 <br>instrig&nbsp; int&nbsp; 保留。 <br>updtrig&nbsp; int&nbsp; 保留。 <br>seltrig&nbsp; int&nbsp; 保留。 <br>category&nbsp; int&nbsp; 用于发布、约束和标识。 <br>cache&nbsp; smallint&nbsp; 保留。 
<br><br>syspermissions&nbsp; 页首<br>包含有关对数据库内的用户、组和角色授予和拒绝的权限的信息。该表存储在每个数据库中。
<br>列名 数据类型 描述 <br>id&nbsp; int&nbsp; 对象权限的对象 ID；0 表示语句权限。 <br>grantee&nbsp; smallint&nbsp; 受权限影响的用户、组或角色的 ID。 <br>grantor&nbsp; smallint&nbsp; 被授予或废除权限的用户、组或角色的 ID。 <br>actadd&nbsp; smallint&nbsp; 仅限内部使用。 <br>actmod&nbsp; smallint&nbsp; 仅限内部使用。 <br>seladd&nbsp; varbinary(4000)&nbsp; 仅限内部使用。 <br>selmod&nbsp; varbinary(4000)&nbsp; 仅限内部使用。 <br>updadd&nbsp; varbinary(4000)&nbsp; 仅限内部使用。 <br>updmod&nbsp; varbinary(4000)&nbsp; 仅限内部使用。 <br>refadd&nbsp; varbinary(4000)&nbsp; 仅限内部使用。 <br>refmod&nbsp; varbinary(4000)&nbsp; 仅限内部使用。 
<br><br>systypes&nbsp; 页首<br>对于每种系统提供数据类型和用户定义数据类型，均包含一行信息。该表存储在每个数据库中。
<br>这些是系统提供的数据类型及其 ID 号。
<br>列名 数据类型 描述 <br>name&nbsp; sysname&nbsp; 数据类型名称。 <br>xtype&nbsp; tinyint&nbsp; 物理存储类型。 <br>status&nbsp; tinyint&nbsp; 仅限内部使用。 <br>xusertype&nbsp; smallint&nbsp; 扩展用户类型。 <br>length&nbsp; smallint&nbsp; 数据类型的物理长度。 <br>xprec&nbsp; tinyint&nbsp; 服务器所使用的内部精度。（不能在查询中使用。） <br>xscale&nbsp; tinyint&nbsp; 服务器所使用的内部小数位数。（不能在查询中使用。） <br>tdefault&nbsp; int&nbsp; 对此数据类型进行完整性检查的存储过程的 ID。 <br>domain&nbsp; int&nbsp; 对此数据类型进行完整性检查的存储过程的 ID。 <br>uid&nbsp; smallint&nbsp; 数据类型创建者的用户 ID。 <br>reserved&nbsp; smallint&nbsp; 仅限内部使用。 <br>usertype&nbsp; smallint&nbsp; 用户类型 ID。 <br>variable&nbsp; bit&nbsp; 可变长度数据类型为 1；否则为 0。 <br>allownulls&nbsp; bit&nbsp; 指出此数据类型的默认为空性。如果 CREATE 或 ALTER TABLE 指定了为空性，那么该值将替代此数据类型的默认为空性。 <br>type&nbsp; tinyint&nbsp; 物理存储数据类型。 <br>printfmt&nbsp; varchar(255)&nbsp; 保留。 <br>prec&nbsp; smallint&nbsp; 此数据类型的精度级别。 <br>scale&nbsp; tinyint&nbsp; 此数据类型的小数位数（根据精度）。 
<br><br>sysusers 页首<br>数据库中每个 Microsoft? Windows 用户、Windows 组、Microsoft SQL Server? 用户或 SQL Server 角色在表中占一行。
<br>列名 数据类型 描述 <br>uid&nbsp; smallint&nbsp; 用户 ID，在此数据库中是唯一的。1 是数据库所有者。 <br>status&nbsp; smallint&nbsp; 仅限内部使用。 <br>Name&nbsp; sysname&nbsp; 用户名或组名，在此数据库中是唯一的。 <br>sid&nbsp; varbinary(85)&nbsp; 此条目的安全性标识符。 <br>roles&nbsp; varbinary(2048)&nbsp; 仅限内部使用。 <br>createdate&nbsp; datetime&nbsp; 帐户的添加日期。 <br>updatedate&nbsp; datetime&nbsp; 帐户的上次修改日期。 <br>altuid&nbsp; smallint&nbsp; 仅限内部使用。 <br>password&nbsp; varbinary(256)&nbsp; 仅限内部使用。 <br>gid&nbsp; smallint&nbsp; 此用户所属的组 ID。如果 uid = gid ，那么此条目就定义一个组。 <br>environ&nbsp; varchar(255)&nbsp; 保留。 <br>hasdbaccess&nbsp; int&nbsp; 如果该帐户有数据库访问权限，则为 1。 <br>islogin&nbsp; int&nbsp; 如果该帐户是有登录帐户的 Windows 组、Windows 用户或 SQL Server 用户，则为 1。 <br>isntname&nbsp; int&nbsp; 如果该帐户是 Windows 组或 Windows 用户，则为 1。 <br>isntgroup&nbsp; int&nbsp; 如果该帐户是 Windows 组，则为 1。 <br>isntuser&nbsp; int&nbsp; 如果该帐户是 Windows 用户，则为 1。 <br>issqluser&nbsp; int&nbsp; 如果该帐户是 SQL Server 用户，则为 1。 <br>isaliased&nbsp; int&nbsp; 如果该帐户以另一个用户为别名，则为 1。 <br>issqlrole&nbsp; int&nbsp; 如果该帐户是 SQL Server 角色，则为 1。 <br>isapprole&nbsp; int&nbsp; 如果该帐户是应用程序角色，则为 1。 
<br>&nbsp;<br> &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[写数据分页的存储过程 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10361.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>依稀记得初初向一位师兄推荐.NET平台的时候,用的例子就是一个简单数据表格的展现,师兄看完例子后劈头盖脸就问这数据分页怎么做?性能如何?对大量的数据支持如何?...那时的我其实也十分懵懂,水平充其量就是照着ScottGu博客中的文章生硬模仿而已,对与这些问题没有什么感性的认知.进入职场后,面对记录数上百万级,甚至上千万级的数据库,数据处理效能问题慢慢浮现在工作的每个角落,编写的代码和设计的结构使效率慢上那几秒钟,也深怕客户来句"体现不良好"之云云,现在想想也惹人发笑:)
<br>今日拿了些旧项目出来扫扫尘,左动动又动动,可全是无伤大雅之举,唯独那些数据分页不明确的迂腐代码特别碍眼,说砍就砍,参照百家之言,憋了一股劲就写好一个比较通用的数据分页的存储过程,生成百万行的数据测试了一下,性能还行,基本都是毫秒级的运算.
<br>我向来的做分页的习惯都是用索引过的主键进行分页,但新问题突然就来了,如果主键是GUID,是个uniqueidentifier怎么办呢?想了很多方法,最后只能锁定在SQL 2005 的新函ROW_NUMBER()上,用上它不就没有那些限制了么?说改就改,代码完工以测试,效能上还没有一些大大吹得那么鸡肋,基本还是毫秒级就完成我给它的任务.
<br>正当我自鸣得意的时候,突然发觉原来自己还是个傻冒,试想谁会去用一个没有规律的值来进行分页,即是做到又有什么意义呢?看这次真是走火入魔,庸人自扰咯 T_T.不过也好,碰壁的过程就是求知的过程,至少今天也对SQL 2005的系统数据库和一些函数特性有进一步了解,不错不错:)
<br>1.没有使用ROW_NUMBER()的存储过程
<br>&nbsp;

/**//***********************************************************************<br>*&nbsp;文件名:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetRecordsPagination.sql<br>*&nbsp;功能:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建存储过程GetRecordsPagination<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[注:只能用于能用MAX,MIN等方法的字段进行分页!]<br><br>*&nbsp;创建时间:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-10-17<br>*&nbsp;创建人:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清风<br>*&nbsp;最后修改时间:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-10-17<br>*&nbsp;最后修改人:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清风<br>***********************************************************************/<br><br>IF&nbsp;EXISTS&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;*<br>&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;INFORMATION_SCHEMA.ROUTINES&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;SPECIFIC_NAME&nbsp;=&nbsp;'GetRecordsPagination')<br>DROP&nbsp;PROCEDURE&nbsp;GetRecordsPagination<br><br>GO<br><br>CREATE&nbsp;PROCEDURE&nbsp;GetRecordsPagination<br>(<br>&nbsp;&nbsp;&nbsp;&nbsp;@tableName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;进行分页表名<br>&nbsp;&nbsp;&nbsp;&nbsp;@columnName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;用作分页的字段名<br>&nbsp;&nbsp;&nbsp;&nbsp;@pageSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;=&nbsp;10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;每页记录数&nbsp;(默认是10)<br>&nbsp;&nbsp;&nbsp;&nbsp;@pageIndex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;=&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;页码&nbsp;(默认第一页)<br>&nbsp;&nbsp;&nbsp;&nbsp;@sortType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bit&nbsp;=&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;数据查找排序类型,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;0&nbsp;升序,1&nbsp;降序&nbsp;(默认&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;@visibleColumns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(2000)&nbsp;=&nbsp;'',&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;要返回的字段,格式"A1,B1,C1"&nbsp;(若为空,则返回全部)<br>&nbsp;&nbsp;&nbsp;&nbsp;@sqlCondition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(2000)&nbsp;=&nbsp;'',&nbsp;--&nbsp;附加查询条件&nbsp;(不包含'where'字串)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;@orderByColumn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256)&nbsp;=&nbsp;'',&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;记录最后排序OrderBy的字段&nbsp;(默认等于@columnName)<br>&nbsp;&nbsp;&nbsp;&nbsp;@orderBySortType&nbsp;&nbsp;&nbsp;&nbsp;bit&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;记录最后排序类型,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;0&nbsp;升序,1&nbsp;降序&nbsp;(默认&nbsp;0)<br>)<br>AS<br><br>declare&nbsp;@strSQL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(8000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;最终合成的SQL语句<br>declare&nbsp;@strTemp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;临时字符串<br>declare&nbsp;@strOrderBy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(1000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;查找排序类型子句<br><br>--&nbsp;设置数据查找排序类型子句<br>if&nbsp;@sortType&nbsp;!=&nbsp;0<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;'&lt;(select&nbsp;min'<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strOrderBy&nbsp;=&nbsp;'&nbsp;order&nbsp;by&nbsp;['&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;']&nbsp;desc'<br>end<br>else<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;'&gt;(select&nbsp;max'<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strOrderBy&nbsp;=&nbsp;'&nbsp;order&nbsp;by&nbsp;['&nbsp;+&nbsp;@columnName&nbsp;+']&nbsp;asc'<br>end<br><br>--&nbsp;设置要返回字段<br>if&nbsp;@visibleColumns&nbsp;=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;@visibleColumns&nbsp;=&nbsp;'&nbsp;*&nbsp;'<br><br>--&nbsp;设置查找语句<br>set&nbsp;@strSQL&nbsp;=&nbsp;'select&nbsp;top&nbsp;'&nbsp;+&nbsp;str(@pageSize)&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@visibleColumns&nbsp;+&nbsp;'&nbsp;&nbsp;from&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']&nbsp;where&nbsp;['&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;']'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'(['<br>&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;'])&nbsp;from&nbsp;(select&nbsp;top&nbsp;'&nbsp;+&nbsp;str((@pageIndex-1)*@pageSize)&nbsp;+&nbsp;'&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;']&nbsp;from&nbsp;['&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']'&nbsp;+&nbsp;@strOrderBy&nbsp;+&nbsp;')&nbsp;as&nbsp;TempTable)'<br>&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@strOrderBy<br><br>--&nbsp;添加附加查询条件<br>if&nbsp;@sqlCondition&nbsp;!=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;'select&nbsp;top&nbsp;'&nbsp;+&nbsp;str(@pageSize)&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@visibleColumns&nbsp;+&nbsp;'&nbsp;&nbsp;from&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']&nbsp;where&nbsp;['&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;']'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'(['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;'])&nbsp;from&nbsp;(select&nbsp;top&nbsp;'&nbsp;+&nbsp;str((@pageIndex-1)*@pageSize)&nbsp;+&nbsp;'&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;']&nbsp;from&nbsp;['&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']&nbsp;where&nbsp;'&nbsp;+&nbsp;@sqlCondition&nbsp;+&nbsp;'&nbsp;'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@strOrderBy&nbsp;+&nbsp;')&nbsp;as&nbsp;TempTable)&nbsp;and&nbsp;'&nbsp;+&nbsp;@sqlCondition&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@strOrderBy<br><br>--&nbsp;优化第一页查询<br>if&nbsp;@pageIndex&nbsp;=&nbsp;1<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@sqlCondition&nbsp;!=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;'&nbsp;where&nbsp;('&nbsp;+&nbsp;@sqlCondition&nbsp;+&nbsp;')'<br><br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;'select&nbsp;top&nbsp;'&nbsp;+&nbsp;str(@pageSize)&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@visibleColumns&nbsp;+&nbsp;'&nbsp;&nbsp;from&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@strOrderBy<br>end<br><br>--&nbsp;设置自定义输出OrderBy<br>if&nbsp;@orderByColumn&nbsp;!=&nbsp;''<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;@strSQL<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@orderBySortType&nbsp;=&nbsp;0&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;&nbsp;'&nbsp;select&nbsp;*&nbsp;from&nbsp;(&nbsp;'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'&nbsp;)&nbsp;as&nbsp;TempTable2&nbsp;order&nbsp;by&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@orderByColumn&nbsp;+&nbsp;']&nbsp;asc'&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;&nbsp;'&nbsp;select&nbsp;*&nbsp;from&nbsp;(&nbsp;'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'&nbsp;)&nbsp;as&nbsp;TempTable2&nbsp;order&nbsp;by&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@orderByColumn&nbsp;+&nbsp;']&nbsp;desc'<br>end&nbsp;&nbsp;<br><br>--测试生成的SQL语句<br>--PRINT&nbsp;@strSQL<br><br>exec&nbsp;(@strSQL)<br><br><br>
<br>&nbsp;
<br>2.使用ROW_NUMBER()的存储过程
<br>&nbsp;

/**//***********************************************************************<br>*&nbsp;文件名:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetRecordsPaginationWithRowNumber.sql<br>*&nbsp;功能:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建存储过程GetRecordsPaginationWithRowNumber<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[注:运用SQL&nbsp;2005新增函数ROW_NUMBER(),有局限性!]<br><br>*&nbsp;创建时间:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-10-17<br>*&nbsp;创建人:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清风<br>*&nbsp;最后修改时间:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-10-17<br>*&nbsp;最后修改人:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清风<br>***********************************************************************/<br><br>IF&nbsp;EXISTS&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;SELECT&nbsp;*<br>&nbsp;&nbsp;&nbsp;&nbsp;FROM&nbsp;INFORMATION_SCHEMA.ROUTINES&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;WHERE&nbsp;SPECIFIC_NAME&nbsp;=&nbsp;'GetRecordsPaginationWithRowNumber')<br>DROP&nbsp;PROCEDURE&nbsp;GetRecordsPaginationWithRowNumber<br><br>GO<br><br>CREATE&nbsp;PROCEDURE&nbsp;GetRecordsPaginationWithRowNumber<br>(<br>&nbsp;&nbsp;&nbsp;&nbsp;@tableName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;进行分页表名<br>&nbsp;&nbsp;&nbsp;&nbsp;@columnName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;用作分页的字段名<br>&nbsp;&nbsp;&nbsp;&nbsp;@pageSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;=&nbsp;10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;每页记录数&nbsp;(默认是10)<br>&nbsp;&nbsp;&nbsp;&nbsp;@pageIndex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;=&nbsp;1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;页码&nbsp;(默认第一页)<br>&nbsp;&nbsp;&nbsp;&nbsp;@sortType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bit&nbsp;=&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;数据查找排序类型,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;0&nbsp;升序,1&nbsp;降序&nbsp;(默认&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;@visibleColumns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(2000)&nbsp;=&nbsp;'',&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;要返回的字段,格式"A1,B1,C1"&nbsp;(若为空,则返回全部)<br>&nbsp;&nbsp;&nbsp;&nbsp;@sqlCondition&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(2000)&nbsp;=&nbsp;'',&nbsp;--&nbsp;附加查询条件&nbsp;(不包含'where'字串)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;@orderByColumn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256)&nbsp;=&nbsp;'',&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;记录最后排序OrderBy的字段&nbsp;(默认等于@columnName)<br>&nbsp;&nbsp;&nbsp;&nbsp;@orderBySortType&nbsp;&nbsp;&nbsp;&nbsp;bit&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;记录最后排序类型,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;0&nbsp;升序,1&nbsp;降序&nbsp;(默认&nbsp;0)<br>)<br>AS<br><br>declare&nbsp;@strSQL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(8000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;最终合成的SQL语句<br>declare&nbsp;@strTemp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(256)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;临时字符串<br>declare&nbsp;@strOrderBy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(1000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;查找排序类型子句<br><br>--&nbsp;设置数据查找排序类型子句<br>if&nbsp;@sortType&nbsp;!=&nbsp;0<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strOrderBy&nbsp;=&nbsp;'&nbsp;order&nbsp;by&nbsp;['&nbsp;+&nbsp;@columnName&nbsp;+&nbsp;']&nbsp;desc'<br>end<br>else<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strOrderBy&nbsp;=&nbsp;'&nbsp;order&nbsp;by&nbsp;['&nbsp;+&nbsp;@columnName&nbsp;+']&nbsp;asc'<br>end<br><br>--&nbsp;设置要返回字段<br>if&nbsp;@visibleColumns&nbsp;=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;@visibleColumns&nbsp;=&nbsp;'&nbsp;*&nbsp;'<br><br>--&nbsp;设置查找语句<br>set&nbsp;@strSQL&nbsp;=&nbsp;'select&nbsp;top&nbsp;'&nbsp;+&nbsp;str(@pageSize)&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@visibleColumns&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;'&nbsp;from&nbsp;(&nbsp;select&nbsp;*&nbsp;,&nbsp;ROW_NUMBER()&nbsp;Over&nbsp;(&nbsp;'&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@strOrderBy&nbsp;+&nbsp;'&nbsp;)&nbsp;as&nbsp;RowNum&nbsp;from&nbsp;['&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']&nbsp;)&nbsp;as&nbsp;TempTable&nbsp;'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;'&nbsp;where&nbsp;RowNum&nbsp;between&nbsp;'&nbsp;+&nbsp;str(&nbsp;(@pageIndex-1)&nbsp;*&nbsp;@pageSize&nbsp;)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;'&nbsp;and&nbsp;'&nbsp;+&nbsp;str(&nbsp;@pageIndex&nbsp;*&nbsp;@pageSize&nbsp;)<br><br>--&nbsp;添加附加查询条件<br>if&nbsp;@sqlCondition&nbsp;!=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;'select&nbsp;top&nbsp;'&nbsp;+&nbsp;str(@pageSize)&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@visibleColumns&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;'&nbsp;from&nbsp;(&nbsp;select&nbsp;*&nbsp;,&nbsp;ROW_NUMBER()&nbsp;Over&nbsp;(&nbsp;'&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@strOrderBy&nbsp;+&nbsp;'&nbsp;)&nbsp;as&nbsp;RowNum&nbsp;from&nbsp;['&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']&nbsp;where&nbsp;'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@sqlCondition&nbsp;+&nbsp;'&nbsp;)&nbsp;as&nbsp;TempTable&nbsp;'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;'&nbsp;where&nbsp;RowNum&nbsp;between&nbsp;'&nbsp;+&nbsp;str(&nbsp;(@pageIndex-1)&nbsp;*&nbsp;@pageSize&nbsp;)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;'&nbsp;and&nbsp;'&nbsp;+&nbsp;str(&nbsp;@pageIndex&nbsp;*&nbsp;@pageSize&nbsp;)<br><br>--&nbsp;优化第一页查询<br>if&nbsp;@pageIndex&nbsp;=&nbsp;1<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@sqlCondition&nbsp;!=&nbsp;''<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;'&nbsp;where&nbsp;('&nbsp;+&nbsp;@sqlCondition&nbsp;+&nbsp;')'<br><br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;'select&nbsp;top&nbsp;'&nbsp;+&nbsp;str(@pageSize)&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@visibleColumns&nbsp;+&nbsp;'&nbsp;&nbsp;from&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@tableName&nbsp;+&nbsp;']'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;@strOrderBy<br>end<br><br>--&nbsp;设置自定义输出OrderBy<br>if&nbsp;@orderByColumn&nbsp;!=&nbsp;''<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strTemp&nbsp;=&nbsp;@strSQL<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;@orderBySortType&nbsp;=&nbsp;0&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;&nbsp;'&nbsp;select&nbsp;*&nbsp;from&nbsp;(&nbsp;'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'&nbsp;)&nbsp;as&nbsp;TempTable2&nbsp;order&nbsp;by&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@orderByColumn&nbsp;+&nbsp;']&nbsp;asc'&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@strSQL&nbsp;=&nbsp;&nbsp;'&nbsp;select&nbsp;*&nbsp;from&nbsp;(&nbsp;'&nbsp;+&nbsp;@strTemp&nbsp;+&nbsp;'&nbsp;)&nbsp;as&nbsp;TempTable2&nbsp;order&nbsp;by&nbsp;['<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;@orderByColumn&nbsp;+&nbsp;']&nbsp;desc'<br>end&nbsp;&nbsp;<br><br>--测试生成的SQL语句<br>PRINT&nbsp;@strSQL<br><br>exec&nbsp;(@strSQL)<br><br><br>
<br>&nbsp;
<br>3.测试代码
<br>&nbsp;

/**//***********************************************************************<br>*&nbsp;文件名:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PageTest.sql<br>*&nbsp;功能:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;测试分页存储过程<br><br>*&nbsp;创建时间:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-10-17<br>*&nbsp;创建人:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清风<br>*&nbsp;最后修改时间:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-10-17<br>*&nbsp;最后修改人:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清风<br>***********************************************************************/<br><br>--&nbsp;创建测试数据<br>--CREATE&nbsp;TABLE&nbsp;PagerTest<br>--(<br>--&nbsp;&nbsp;&nbsp;&nbsp;pGUID&nbsp;&nbsp;&nbsp;&nbsp;uniqueidentifier&nbsp;primary&nbsp;key,<br>--&nbsp;&nbsp;&nbsp;&nbsp;pNum&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;NULL<br>--);<br>--<br>--DECLARE&nbsp;@i&nbsp;int<br>--set&nbsp;@i&nbsp;=&nbsp;1<br>--&nbsp;这里只使用了一百万行数据进行测试<br>--WHILE&nbsp;@i&nbsp;&lt;&nbsp;1000000<br>--BEGIN<br>--&nbsp;&nbsp;&nbsp;&nbsp;INSERT&nbsp;INTO&nbsp;PagerTest<br>--&nbsp;&nbsp;&nbsp;&nbsp;VALUES(NEWID(),@i)<br>--&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;@i&nbsp;=&nbsp;@i&nbsp;+&nbsp;1<br>--END<br>--<br>--CREATE&nbsp;INDEX&nbsp;IdxGUID&nbsp;ON&nbsp;PagerTest(pGUID);<br>--CREATE&nbsp;INDEX&nbsp;IdxNum&nbsp;ON&nbsp;PagerTest(pNum);<br><br>--&nbsp;测试数据<br>--SELECT&nbsp;*<br>--FROM&nbsp;PagerTest<br>--ORDER&nbsp;BY&nbsp;pNUM&nbsp;ASC<br>--<br>--&nbsp;清空数据<br>--DROP&nbsp;TABLE&nbsp;PagerTest<br><br><br>--&nbsp;测试GetRecordsPagination<br>exec&nbsp;GetRecordsPagination&nbsp;PagerTest,pNum,10,10000,0,'','',pNum,1;&nbsp;<br>exec&nbsp;GetRecordsPagination&nbsp;PagerTest,pNum,10,10<br><br>--&nbsp;测试GetRecordsPaginationWithRowNumber<br>exec&nbsp;GetRecordsPaginationWithRowNumber&nbsp;PagerTest,pNum,10,10<br>exec&nbsp;GetRecordsPaginationWithRowNumber&nbsp;PagerTest,pNum,10,10,1,'pNum','pNum&nbsp;&gt;&nbsp;999903',pNum,0;&nbsp;<br>exec&nbsp;GetRecordsPaginationWithRowNumber&nbsp;PagerTest,pGUID,10,10,1,'','',pNum,0;&nbsp;<br><br><br><br> &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[如何获得数据库里所有表的名字 C# ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10358.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>如何获得数据库里所有表的名字
<br>平时我们操作比较多的都是表里的数据，也许突然有一天会需要把所有表的名字都列出来看一看——比如，你的论坛是按每个版块一个表来管理的，这时候你要在首页列出各版块的名字。应该怎么办呢？
<br>肯定得用SELECT吧……但我们平时使用SELECT操作的数据都是表里的数据，表的名字并不是表的数据，这可怎么办呢？
<br>你可能会想：“功能强大的SQL Server不会连这么简单的功能都实现不了吧？一定会把所有表的名字存储在某个表里……”注意啦！在这儿我要小小地偷换一下概念了——视图（View）也算是一种“表”，只不过它是由固定查询形成的一种“虚拟表”。
<br>OK，你猜对啦！由SQL Server管理的每个数据库里都有一个名为sysobjects的视图，它是system级别的，所以它的全限定名是——sys.sysobjects
<br>你可能又会问：“为什么不是sys.tables而是sys.objects呢？”问的好！因为这张表里存储的可不光是数据库里的表，它存储的是一个数据库中所有的“对象”——杂七杂八包括了表的主键、存储过程、触发器等等，一共是24种——表（Table，确切地说是“用户自定义表”）只是这24种对象中的一种。
<br>剩下的事情……吼吼……
<br>执行下面的查询语句，可以得到所有包含在sys.sysobjects视图里的数据
<br>USE AdventureWorks<br>SELECT *<br>FROM sys.sysobjects<br>GO<br>得出数据后，请注意名为type的列——这一列标明了对象的类型，也就是前面提到的24种。在这里，我用一个表格把它们列出来：
<br>AF = Aggregate function (CLR) <br>C = CHECK constraint <br>D = DEFAULT (constraint or stand-alone) <br>F = FOREIGN KEY constraint <br>FN = SQL scalar function <br>FS = Assembly (CLR) scalar function <br>FT = Assembly (CLR) table-valued function <br>IF = SQL inline table-valued function <br>IT = Internal table <br>P = SQL stored procedure <br>PC = Assembly (CLR) stored procedure <br>PK = PRIMARY KEY constraint <br>R = Rule (old-style, stand-alone) <br>RF = Replication-filter-procedure <br>S = System base table <br>SN = Synonym <br>SQ = Service queue <br>TA = Assembly (CLR) DML trigger <br>TF = SQL table-valued-function <br>TR = SQL DML trigger <br>U = Table (user-defined) <br>UQ = UNIQUE constraint <br>V = View <br>X = Extended stored procedure 
<br><br>OK，我们要得到名称的表（用户自定义表）就是类型为“U”的对象；而sys.objects的类型为“S”。所以，为了达到我们的最终目的，SQL语句应该是——
<br>USE AdventureWorks<br>SELECT name<br>FROM sys.sysobjects<br>WHERE type='U'<br>GO<br>&nbsp;
<br>&nbsp;下面我再给出一段用C#实现的代码：
<br>&nbsp;&nbsp; 
<br>//========&lt;水之真谛&gt;========//<br>//====&lt;以人为本，关注民生&gt;====//<br>//&nbsp;&nbsp; http://blog.csdn.net/FantasiaX&nbsp;&nbsp; //<br>using System;<br>using System.Data.SqlClient;
<br>namespace SqlSample<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class Program<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; static void Main(string[] args)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string connectionString = @"Server=(local); Database=AdventureWorks; User ID=sa; Password=password";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlConnection connection = new SqlConnection();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.ConnectionString = connectionString;
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string sqlCommandString = @"USE AdventureWorks SELECT name FROM sys.sysobjects WHERE type='U' ORDER BY name";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlCommand command = new SqlCommand();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; command.CommandType = System.Data.CommandType.Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; command.CommandText = sqlCommandString;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; command.Connection = connection;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open();
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SqlDataReader reader = command.ExecuteReader();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (reader.Read())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(reader[@"name"]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>}<br> &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[谈谈数据库更新(Update语句)查询 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10355.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>谈谈数据库更新(Update语句)查询
<br>今天有人在群上问了关于数据库更新的问题，在此，我将数据库更新的问题给总结一下<br>说白了，数据库更新就一种方法Update，<br>其标准格式：Update 表名 set 字段=值 where 条件<br>不过根据数据的来源不同，还是有所区别的
<br>1.从外部输入<br>这种比较简单<br>例：update tb set UserName="XXXXX" where UserID="aasdd"
<br>2.一些内部变量，函数等，比如时间等<br>直接将函数赋值给字段<br>update tb set LastDate=date() where UserID="aasdd"
<br>3.对某些字段变量+1，常见的如：点击率、下载次数等<br>这种直接将字段+1然后赋值给自身<br>update tb set clickcount=clickcount+1 where ID=xxx
<br>4.将同一记录的一个字段赋值给另一个字段<br>update tb set Lastdate= regdate where XXX
<br>5.将一个表中的一批记录更新到另外一个表中<br>table1 <br>ID f1 f2<br>table2 <br>ID f1 f2<br>先要将table2中的f1 f2 更新到table1（相同的ID）
<br>update table1,table2 set table1.f1=table2.f1,table1.f2=table2.f2 where table1.ID=table2.ID
<br>6.将同一个表中的一些记录更新到另外一些记录中<br>表：a<br>ID&nbsp;&nbsp; month&nbsp;&nbsp; E_ID&nbsp;&nbsp;&nbsp;&nbsp; Price<br>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br>3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5<br>4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5<br>先要将表中2月份的产品price更新到1月份中<br>显然，要找到2月份中和1月份中ID相同的E_ID并更新price到1月份中<br>这个完全可以和上面的方法来处理，不过由于同一表，为了区分两个月份的，应该将表重命名一下<br>update a,a as b set a.price=b.price where a.E_ID=b.E_ID and a.month=1 and b.month=2
<br>当然，这里也可以先将2月份的查询出来，在用5.的方法去更新
<br>update a,（select * from a where month=2）as b set a.price=b.price where a.E_ID=b.E_ID and a.month=1
<br>&nbsp; &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[利用SQL2005反系列化去替代ORM ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10346.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[ORM用多了就会发现越来越多的问题。。。。。最后就觉得ORM简直是鸡肋....(呵呵，别拿砖头砸我，个人觉得而已)<br><br>最后没办法了，发现SQL2005出来一个for xml 可以直接将查询生成xml返回，如果能把这个返回来的xml直接反系列化成实体，貌似很可爱，在测试了一段时间后决定把它用到项目中去。项目完成用到现在为止还没出现过严重问题，看来这个解决方案是可行的，不敢独享，贴出来大家一起讨论讨论。<br><br>　　一。在使用过程中，遇到过以下几个问题：<br>　　1、编写查询的存储过程是比较麻烦的（为此专门写了个windows小工具来辅助生成查询）<br>　　2、实体名不能随便改。。。。跟查询的存储过程有联系（这个就没办法了，反正实体名我不改就是了）<br>　　3、xml非法字符问题。（替换。。。）<br>　　4、xml中带有html字符的时候（cdata，然而怎么在数据库查询的是偶构建cdata字段的问题）<br>　　5、好像没再遇到什么问题了，至于有人说大量查询的时候会出现xml断层的问题也是比较容易解决的<br><br>　　二。至于效率问题的话，现在这个项目网站运行差不多一个月来有12000用户注册，不见有任何服务器CPU过高或者死机的情况（当然这跟数据库存储过程优化以及数据库索引有很大关系），算是比较满意。<br>　　三。详细解决方案<br>　　1、数据库方面<br>　　当然不能再用SELECT * FROM 什么的方法了。下面是一个简单的查询<br>a、返回数据集<br>SELECT <br>1 as Tag, <br>0 as Parent, <br>UserId as [Users!1!UserId!ELEMENT],--用户ID <br>UserEmail as [Users!1!UserEmail!cdata] --用户Email <br>FROM <br>[User] <br>FOR XML EXPLICIT,ROOT('ArrayOfUser')<br>b、返回单条数据<br>SELECT <br>1 as Tag, <br>0 as Parent, <br>UserId as [Users!1!UserId!ELEMENT],--用户ID <br>UserEmail as [Users!1!UserEmail!cdata] --用户Email （注意，这里使用cdata就可以把生成的xml文件UserEmail包含在cdata中）<br>FROM <br>[User] WHERE UserId = 1<br>FOR XML EXPLICIT<br>2、程序方面<br>　　呵，不像一些ORM框架一样要引入项目，生成配置文件这么痛苦～～换来的是要自己写sqlcommand，open sqlconnection等等，但是我个人认为这些东西自己写的话也有很多方法可以偷懒，呵呵在这里就不介绍这些东西了，反正创建一个SQLCOMMAND,给SQLCOMMAND提供相应的参数，然后SQLCOMMAND.ExecuteDataReader就好了。。。<br>　　a、当然你的有个User的实体，大概如下：<br>public class User<br>{<br>int userId = 0; <br>public int UserId<br>{<br>get{}<br>set{}<br>}<br>//略<br>}<br>b、然后你必须将上面的存储过程执行，并返回datareader<br>c、反序列化<br>private static Regex reg = new Regex("[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]", RegexOptions.Compiled| RegexOptions .IgnoreCase | RegexOptions.Multiline); <br>　/**//// <br>　/// 反序列化对象<br>　/// <br>　/// 源xml字符串<br>　/// 要序列化后的类型<br>　/// 结果<br>　static public object Deserialize(string xmlstr, Type objtype)<br>　{<br>　if (string.IsNullOrEmpty(xmlstr))<br>　return null; <br>　object obj = null; <br>　xmlstr = reg.Replace(xmlstr, ""); <br>　XmlSerializer serializer = new XmlSerializer(objtype); <br>　try<br>　{<br>　obj = serializer.Deserialize(new StringReader(xmlstr)); <br>　}<br>　catch {<br>　xmlstr = xmlstr.Replace("&amp;", "&amp; "); <br>　obj = serializer.Deserialize(new StringReader(xmlstr)); <br>　}<br>　return obj; <br>　} <br>　/**//// <br>　/// 反序列化对象<br>　 /// <br>　/// 从reader进行反序列化，序列化完毕后将在这里关闭<br>　/// 要序列化后的类型<br>　/// 结果<br>　static public object Deserialize(System.Data.IDataReader reader, Type objtype)<br>　{<br>　return Deserialize(reader, objtype, true); <br>　}<br>　/**//// <br>　/// 反序列化对象<br>　 /// <br>　/// 从reader进行反序列化，序列化完毕后将在这里关闭<br>　/// 要序列化后的类型<br>　/// 是否关闭IDataReader<br>　/// 结果<br>　static public object Deserialize(System.Data.IDataReader reader, Type objtype,bool isCloseReader)<br>　{<br>　StringBuilder sb = new StringBuilder(); <br>　while (reader.Read())<br>　sb.Append(reader[0].ToString()); <br>　if(isCloseReader)<br>　reader.Close(); <br>　try<br>　{<br>　return Deserialize(sb.ToString(), objtype); <br>　}<br>　catch (Exception ex)<br>　{<br>　throw; <br>　}<br>　}<br>　　d、将你执行后的datareader直接调用上面的方法<br>User user = Deserialize(reader,typeof(User)); 或者<br>User[] user = Deserialize(reader,typeof(User[])); <br> &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[解决SQL Server占用内存过多的问题 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10345.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>经常看见有人问，MSSQL占用了太多的内存，而且还不断的增长; 或者说已经设置了使用内存，可是它没有用到那么多，这是怎么一回事儿呢?
<br>　　首先，我们来看看MSSQL是怎样使用内存的。
<br>　　最大的开销一般是用于数据缓存，如果内存足够，它会把用过的数据和觉得你会用到的数据统统扔到内存中，直到内存不足的时候，才把命中率低的数据给清掉。所以一般我们在看statistics io的时候，看到的physics read都是0。
<br>　　其次就是查询的开销，一般地说，hash join是会带来比较大的内存开销的，而merge join和nested loop的开销比较小，还有排序和中间表、游标也是会有比较大的开销的。
<br>　　所以用于关联和排序的列上一般需要有索引。
<br>　　再其次就是对执行计划、系统数据的存储，这些都是比较小的。
<br>　　我们先来看数据缓存对性能的影响，如果系统中没有其它应用程序来争夺内存，数据缓存一般是越多越好，甚至有些时候我们会强行把一些数据pin在高速缓存中。但是如果有其它应用程序，虽然在需要的时候MSSQL会释放内存，但是线程切换、IO等待这些工作也是需要时间的，所以就会造成性能的降低。这样我们就必须设置MSSQL的最大内存使用。可以在SQL Server 属性(内存选项卡)中找到配置最大使用内存的地方，或者也可以使用sp_configure来完成。如果没有其它应用程序，那么就不要限制MSSQL对内存的使用。
<br>　　然后来看查询的开销，这个开销显然是越低越好，因为我们不能从中得到好处，相反，使用了越多的内存多半意味着查询速度的降低。所以我们一般要避免中间表和游标的使用，在经常作关联和排序的列上建立索引。 &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[SQL Server中读取XML文件的简单做法 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-28/article10344.shtml]]></link>
      <pubDate><![CDATA[2007-10-28]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>SQL Server 2000使得以XML导出数据变得更加简单，但在SQL Server 2000中导入XML数据并对其进行处理则有些麻烦。 
<br>　　如果你参考Books Online（BOL），你会发现有相关的条目，包括OPENXML以及 OPENROWSET。所有的这些例子都支持将XML文本作为已经声明的变量，这对于经常处理文本的用户来说非常方便，但对于希望在开发中读取XML文件并进行相应处理的开发人员来说就不是这样了。处理这样的问题，或许最好从内到外来对其进行分析。 
<br>　　OPENXML是一个rowset函数（即返回一个rowset），它的工作方式类似于rowset函数OPENQUERY和OPENROWSET。使用OPENXML可以对XML数据执行JOINs操作而无需首先导入数据。你还可以将其同INSERT、SELECT、UPDATE以及DELETE等操作联合使用。 然而，要使用OPENXML，你必须执行两项OPENQUERY和OPENROWSET并不需要的任务。这两项任务需要两个系统存储进程。 第一个是sp_xml_preparedocument，它将读取特定的XML文本并将其内容提取到内存中。其语法如下： 
<br>　　sp_xml_preparedocument @hdoc = OUTPUT, <br>　　[, @xmltext = ] <br>　　[, @xpath_namespaces = 
<br>　　具体参数如下： @hdoc：指向某内存区域的句柄（从作用上看等同于一个指针），相关数据存放在这里。注意这是一个输出变量，当该进程运行后，该变量将包含指向XML文件内容在内存地址的句柄。由于你需要在随后使用此结果，因此要确保对其进行保存； @xmltext：实际上你所希望处理的XML文本； @xml_namespaces：为了正常操作你的XML数据所需要的任何名字空间索引（namespace references）。注意在这里出现的任何URL都需要用尖括号（&lt;&gt;）括起来； 假设所传递的这些参数都有效，并且XML文档存在，那么你的XML数据就会被存放到内存中去。现在你就可以调用sp_xml_preparedocument，传递存放有XML文件的变量，然后执行OPENXML。语法如下： 
<br>　　OPENXML(idocint [in],rowpatternnvarchar[in],[flagsbyte[in]]) <br>　　[WITH (SchemaDeclaration 　 TableName)] 
<br>　　注意：在本文中没有足够的文字来描述OPENXML所接收的参数。请参阅BOL以获取更多信息。在Transact-SQL Reference中查找OPENXML。 
<br>　　现在我们已经到达了最后的步骤。所有剩下的工作就是导入一个实际的XML文件到SQL并进行处理（很奇快为什么所有的BOL示例都没有涉及到这一关键的部分）。（我必须感谢我的同事Billy Pang所给予的帮助。他帮助我解决这个问题，并给出了代码——尽管出于本文需要我对代码进行了裁减。谢谢Billy！） 基本的技巧是，将文件逐行按文本读取。然后把所有读取的行连接为一个大的VARCHAR变量。最后，将变量传递给前面所说的代码。 
<br>　　以下就是读取文件并将其内容存放到某变量的代码： <br>　　DECLARE @FileName varchar(255) <br>　　DECLARE @ExecCmd VARCHAR(255) <br>　　DECLARE @y INT <br>　　DECLARE @x INT <br>　　DECLARE @FileContents VARCHAR(8000) <br>　　CREATE TABLE #tempXML(PK INT NOT NULL IDENTITY(1,1), ThisLine VARCHAR(255)) <br>　　SET @FileName = 'C:\Temp\CurrentSettings.xml' <br>　　SET @ExecCmd = 'type ' + @FileName <br>　　SET @FileContents = '' 
<br>　　INSERT INTO #tempXML EXEC master.dbo.xp_cmdshell @ExecCmd <br>　　SELECT @y = count(*) from #tempXML <br>　　SET @x = 0 <br>　　WHILE @x &lt;&gt; @y <br>　　BEGIN <br>　　SET @x = @x + 1 <br>　　SELECT @FileContents = @FileContents + ThisLine from #tempXML WHERE PK <br>　　= @x <br>　　END <br>　　SELECT @FileContents as FileContents <br>　　DROP TABLE #tempXML 
<br>　　现在在变量@FileContents变量中你已经获得了文件的全部内容。所需要做的只是将变量通过@xmltext参数传递给sp_xml_preparedocument，然后再调用OPENXML。 
<br>　　有了这种解决办法，对XML文档进行各种处理就成为了可能。你可以将XML文档同SQL表格连接在一起而无需导入数据，然后对这些数据进行INSERT、PDATE和DELETE等任何操作。 &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[数据库日志文件过大或已满的解决方法_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2665.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>&nbsp;&nbsp;EXEC&nbsp;&nbsp;&nbsp;sp_attach_single_file_db&nbsp;&nbsp;&nbsp;@dbname&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;’pubs’,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@physname&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;’c:\Program&nbsp;&nbsp;&nbsp;Files\Microsoft&nbsp;&nbsp;&nbsp;SQL&nbsp;&nbsp;&nbsp;Server\MSSQL\Data\pubs.mdf’&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;5.为了以后能自动收缩,做如下设置:&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;企业管理器--服务器--右键数据库--属性--选项--选择"自动收缩"&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;--SQL语句设置方式:&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;EXEC&nbsp;&nbsp;&nbsp;sp_dboption&nbsp;&nbsp;&nbsp;’数据库名’,&nbsp;&nbsp;&nbsp;’autoshrink’,&nbsp;&nbsp;&nbsp;’TRUE’&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;6.如果想以后不让它日志增长得太大&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;企业管理器--服务器--右键数据库--属性--事务日志&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;--将文件增长限制为xM(x是你允许的最大数据文件大小)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;--SQL语句的设置方式:&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;alter&nbsp;&nbsp;&nbsp;database&nbsp;&nbsp;&nbsp;数据库名&nbsp;&nbsp;&nbsp;modify&nbsp;&nbsp;&nbsp;file(name=逻辑文件名,maxsize=20)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;<br>本新闻共2页,当前在第2页&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[数据库日志文件过大或已满的解决方法_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2664.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;一个很小的站点有可能经过一段时间以后日志文件会变得很大，这是我们常遇到的问题，那么应该怎么样解决这个问题呢？&nbsp;请看下文我们给出的具体方法，请一步步执行，事先请备份好数据库&nbsp;以防不测！&nbsp;呵呵&nbsp;~ <br>--压缩日志及数据库文件大小&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;1.清空日志&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;DUMP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRANSACTION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;库名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WITH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NO_LOG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;2.截断事务日志：&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;BACKUP&nbsp;&nbsp;&nbsp;LOG&nbsp;&nbsp;&nbsp;数据库名&nbsp;&nbsp;&nbsp;WITH&nbsp;&nbsp;&nbsp;NO_LOG&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;3.收缩数据库文件(如果不压缩,数据库的文件不会减小&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;企业管理器--右键你要压缩的数据库--所有任务--收缩数据库--收缩文件&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;--选择日志文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;--选择数据文件--在收缩方式里选择收缩至XXM,这里会给出一个允许收缩到的最小M数,直接输入这个数,确定就可以了&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;也可以用SQL语句来完成&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;--收缩数据库&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;DBCC&nbsp;&nbsp;&nbsp;SHRINKDATABASE(客户资料)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;--收缩指定数据文件,1是文件号,可以通过这个语句查询到:select&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;&nbsp;sysfiles&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;DBCC&nbsp;&nbsp;&nbsp;SHRINKFILE(1)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;4.为了最大化的缩小日志文件&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;a.分离数据库:&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;企业管理器--服务器--数据库--右键--分离数据库&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;b.在我的电脑中删除LOG文件&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;c.附加数据库:&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;企业管理器--服务器--数据库--右键--附加数据库&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;此法将生成新的LOG，大小只有500多K&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;或用代码：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;下面的示例分离&nbsp;&nbsp;&nbsp;pubs，然后将&nbsp;&nbsp;&nbsp;pubs&nbsp;&nbsp;&nbsp;中的一个文件附加到当前服务器。&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;a.分离&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;EXEC&nbsp;&nbsp;&nbsp;sp_detach_db&nbsp;&nbsp;&nbsp;@dbname&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;&nbsp;’pubs’&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;b.删除日志文件&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;c.再附加&nbsp;&nbsp;&nbsp; <br>本新闻共2页,当前在第1页&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[SQL Server数据库安全管理经验谈_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2663.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[　　很长时间以前，我听说在SQL&nbsp;Server上工作要随时做好出现糟糕情况的心理准备。实际上，为了保护您的软件以防止恶意攻击，您最好先尝试自己攻击这些软件，恶意攻击可能来自怀有不满情绪的员工、出于经济目的犯罪活动或者竞争对手在试图获取您的用户列表等等。 <br><br>　　您的代码可以帮助进行测试：编写一个存储过程然后用错误的输入格式来施展进攻，例如，在需要日期的地方，传递一个错误的日期或一个字符串，在需要货币格式的地方，输入一个日期等等。 <br><br>　　作为一个数据库管理员，您应当阻挡各种攻击，并将这些攻击方法写在一个存储过程或者UDF中，然后对系统进行测试。如果存在安全隐患，那么将这些问题向前台软件的作者进行汇报也是您的职责所在。 <br><br>　　没有意义的输入应当尽可能地被前台软件阻挡在外，错误的和恶意的输入（也就是具有破坏性但并不是完全没有实意的信息）可能会通过前台软件的检测，这时，您应当在此处与它们展开战斗。 <br><br>　　最安全的办法是强制前台软件调用存储过程或者UDF，这样，SQL&nbsp;Server将会处理通过了前台软件检测的这些有问题的输入，然后将它们退回，这样，问题就回到了前台软件的开发团队，您可以将错误号码、您的存储过程中自定义的文本一同递交给开发团队，或者什么都不必做，就等着错误自己浮出水面。
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[SQL Server 用户自定义的数据库修复_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2662.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>如果控制文件是利用备份修复的， <br>必须在RECOVER名利中指定USING&nbsp;BACKUP&nbsp;CONTROLFILE子句； <br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;OPEN&nbsp;RESETLOGS; <br><br>立即对数据库进行一次完全备份。&nbsp; <br><br>3、&nbsp;基于撤销的不完全恢复。&nbsp; <br><br>SQL&gt;RECOVER&nbsp;DATABASE&nbsp;UNTIL&nbsp;CANCEL：其它步骤同基于时间的不完全恢复。&nbsp; <br><br>4、&nbsp;基于SCN的不完全恢复。&nbsp; <br><br>在进行基于SCN的不完全恢复时，oracle会在应用了所有具有小于等于指定SCN的事务的重做记录之后终止恢复过程。&nbsp; <br><br>RESETLOGS选项在如下三种情况下，必须使用RESETLOGS选项打开数据库：&nbsp; <br><br>1、&nbsp;在执行任何类型的不完全介质恢复之后；&nbsp; <br><br>2、&nbsp;在使用备份修复控制文件后（在RECOVER命令中使用USING&nbsp;BACKUP&nbsp;CONTROLFILE子句）；&nbsp; <br><br>在没有联机重做日志文件备份的情况下对不归档数据库进行完全恢复之后。<br>本新闻共3页,当前在第3页&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;3&nbsp;&nbsp;
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[SQL Server 用户自定义的数据库修复_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2661.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>查询数据文件的名称和状态。 <br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;DATAFILE&nbsp;…&nbsp;ONLINE; <br>将脱机数据文件改未联机。 <br>SQL&gt;RECOVER&nbsp;DATABASE&nbsp; <br>或&nbsp;SQL&gt;RECOVER&nbsp;TABLESPACE&nbsp;users <br>或&nbsp;SQL&gt;RECOVER&nbsp;DATAFILE&nbsp;‘I:&nbsp;ora9ioradatausers0.dbf; <br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;OPEN; <br><br>2、&nbsp;打开状态下的完全介质恢复。&nbsp; <br><br>SQL&gt;SELECT&nbsp;d.file#&nbsp;f#,d.name,d.status, <br>h.status&nbsp;from&nbsp;v$datafile&nbsp;d,v$datafile_header&nbsp;h <br>WHERE&nbsp;d.file#=h.file#; <br>查询哪些数据文件被自动设置为脱机状态； <br>SQL&gt;ALTER&nbsp;TABLESPACE&nbsp;users&nbsp;OFFLINE&nbsp;TEMPORARY; <br><br>将包含损坏数据文件的表空间设置为脱机状态；将数据文件恢复到原来的位置上，如果介质故障无法排除，需要将数据文件恢复到其它位置上；利用备份修复丢失或损坏的数据文件；如果修复后的数据文件不在原来的位置上，需要使用ALTER&nbsp;DATABASE&nbsp;RENAME&nbsp;FILE&nbsp;…TO&nbsp;…语句在控制文件中更新它们的信息。&nbsp; <br><br>SQL&gt;RECOVER&nbsp;TABLESPACE&nbsp;users&nbsp;AUTOMATIC <br>对包含损坏数据文件的脱机表空间进行恢复； <br>SQL&gt;ALTER&nbsp;TABLESPACE&nbsp;users&nbsp;ONLINE; <br><br>四、&nbsp;归档模式下的不完全介质恢复&nbsp; <br><br>1、&nbsp;不完全恢复的操作准则:&nbsp; <br><br>在恢复前后都对数据库进行完全备份。&nbsp; <br><br>完成不完全介质恢复后，检查数据库是否已经恢复到了目标时刻下的状态。&nbsp; <br><br>完成不完全介质恢复后，将归档重做日志文件移动到其它位置保存。&nbsp; <br><br>2、&nbsp;基于时间的不完全恢复：&nbsp; <br><br>对数据库进行一次完全备份，包括控制文件和所有的联机重做日志文件。&nbsp; <br><br>SQL&gt;SHUTDOWN&nbsp;ABORT：确定不完全介质恢复的目标时间，即你需要将数据库恢复到哪个时刻下的状态，然后确定需要使用哪些备份来对数据进行修复，数据库修复所使用的控制文件备份应当能够正确反映出目标时刻下数据库的物理结构，所使用的数据文件备份应当是在目标时刻之前创建的，而且必须修复所有的数据文件，如果没有在目标时刻之前建立的数据文件备份，需要重新创建空白的数据文件。&nbsp; <br><br>如果在数据库中包含在目标时刻之后建立的数据文件，不要对这个数据文件进行修复，因为在完成不完全恢复后的数据库中根本不应当存在这个数据文件；将数据文件恢复到原来的位置上，如果介质故障无法排除，则恢复到其它位置上；利用选定的备份文件修复所有的控制文件和数据文件。&nbsp; <br><br>SQL&gt;STARTUP&nbsp;MOUNT&nbsp;启动实例并加载数据库；如果修复后的数据文件不在它们原来的位置上，需使用ALTER&nbsp;DATABASE&nbsp;RENAME&nbsp;FILE&nbsp;…&nbsp;TO&nbsp;…语句在控制文件中更新它们的信息。&nbsp; <br><br>SQL&gt;SELECT&nbsp;name,status&nbsp;FROM&nbsp;V$DATAFILE; <br>确定所有数据文件都处于联机 <br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;DATAFILE&nbsp;…&nbsp;ONLINE; <br>将数据文件恢复为联机； <br>SQL&gt;RECOVER&nbsp;DATABASE&nbsp;UNTIL&nbsp;TIME&nbsp;‘2004-02-01:12:30:30’ <br>本新闻共3页,当前在第2页&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;3&nbsp;&nbsp;
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[SQL Server 用户自定义的数据库修复_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2660.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[本文讲解了用户如何自定义的数据库修复。&nbsp; <br><br>一、自动应用重做日志&nbsp; <br><br>1、&nbsp;利用SET&nbsp;AUTORECOVERY命令自动应用重做日志，完成对数据文件的修复操作。&nbsp; <br><br>SQL&gt;STARTUP&nbsp;MOUNT:启动实例并加载数据库。&nbsp; <br><br>SQL&gt;SET&nbsp;AUTORECOVERY&nbsp;ON:启用重做日志自动应用功能。&nbsp; <br><br>SQL&gt;RECOVER&nbsp;DATABASE:恢复指定表空间、数据文件或整个数据库。&nbsp; <br><br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;OPEN:完成恢复后打开数据库。&nbsp; <br><br>2、&nbsp;利用RECOVERY&nbsp;AUTOMATIC命令自动应用重做日志，完成对数据文件的修复操作。&nbsp; <br><br>SQL&gt;STARTUP&nbsp;MOUNT:启动实例并加载数据库。&nbsp; <br><br>SQL&gt;RECOVER&nbsp;AUTOMATIC&nbsp;DATABASE。&nbsp; <br><br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;OPEN:完成恢复后打开数据库。&nbsp; <br><br>二、&nbsp;不归档模式下的数据库介质恢复&nbsp; <br><br>1、&nbsp;将数据库恢复到原来的位置上。&nbsp; <br><br>SQL&gt;SHUTDOWN&nbsp;IMMEDIATE&nbsp;如果数据库仍然处于打开状态，关闭数据库；将数据库文件恢复到原来的位置上，利用最近一次建立的一致性完全备份对整个数据库进行恢复，必须对所有的数据文件与控制文件进行修复。&nbsp; <br><br>SQL&gt;RECOVER&nbsp;DATABASE&nbsp;UNTIL&nbsp;CANCEL <br>SQL&gt;CANCEL <br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;OPEN&nbsp;RESETLOGS; <br>将当前重做日志顺序号设置为1。 <br><br>2、&nbsp;将数据库恢复到新的位置上。&nbsp; <br><br>SQL&gt;SHUTDOWN&nbsp;IMMEDIATE：如果数据库仍然处于打开状态，关闭数据库；将数据库文件恢复到新的位置上，利用最近一次建立的一致性完全备份对整个数据库进行恢复，必须对所有的数据文件与控制文件进行修复；对初始化参数文件中的CONTROL_FILES参数进行编辑，使它执行保存在新位置中修复后的控制文件。&nbsp; <br><br>SQL&gt;STARTUP&nbsp;MOUNT：如果修复后的数据库文件处于新的位置，必须利用ALTER&nbsp;DATABASE&nbsp;RENAME&nbsp;FILE语句对控制文件进行修改，使它指向新位置中修复后的数据文件。如：&nbsp; <br><br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;RENAME&nbsp;FILE&nbsp; <br>‘I:&nbsp;ora9ioradatasystem01.dbf’&nbsp;TO&nbsp;‘K:&nbsp;oracleoradatasystem01.dbf’; <br>SQL&gt;RECOVER&nbsp;DATABASE&nbsp;UNTIL&nbsp;CANCEL <br>SQL&gt;CANCEL <br>SQL&gt;ALTER&nbsp;DATABASE&nbsp;OPEN&nbsp;RESETLOGS; <br>将当前重做日志顺序号设置为1。 <br><br>三、&nbsp;归档模式下的完全介质恢复&nbsp; <br><br>1、&nbsp;关闭状态下的完全恢复。&nbsp; <br><br>SQL&gt;SHUTDOWN&nbsp;ABORT（如果数据库处于打开状态，将它强行关闭）：将数据文件恢复到原来的位置上，如果介质故障无法排除，需要将数据文件恢复到其它位置上；利用备份修复丢失或损坏的数据文件，也可利用ALTER&nbsp;DATABASE&nbsp;CREATE&nbsp;DATAFILE&nbsp;语句重建一个空白的数据文件替换对视或损坏的数据文件。&nbsp; <br><br>SQL&gt;STARTUP&nbsp;MOUNT:如果修复后的数据文件不在原来的位置上，需要使用ALTER&nbsp;DATABASE&nbsp;RENAME&nbsp;FILE&nbsp;…TO&nbsp;…语句在控制文件中更新它们的信息。&nbsp; <br><br>SQL&gt;SELECT&nbsp;name,status&nbsp;FROM&nbsp;V$DATAFILE; <br>本新闻共3页,当前在第1页&nbsp;&nbsp;1&nbsp;&nbsp;2&nbsp;&nbsp;3&nbsp;&nbsp;
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[sql server数据库定时自动备份_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2659.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;对于服务器数据的备份是比较麻烦的事情，如果每天或者经常要手工去备份自然是很痛苦的事情。这里我介绍一种通过sql&nbsp;server的作业调度来建立自动备份的方法： <br>&nbsp;&nbsp;&nbsp;&nbsp;1、进入企业管理器中-&gt;管理-&gt;sql&nbsp;server代理-&gt;作业； <br>&nbsp;&nbsp;&nbsp;&nbsp;2、新建作业，作业名称随便取，例如：data备份，所有者选择sa，当然你也可以选择其他用户，前提是该用户有执行作业的权限； <br>&nbsp;&nbsp;&nbsp;&nbsp;3、点击步骤标签，进入步骤面板。新建步骤，步骤名可以随便填写，如步骤1，类型和数据库默认，不需要修改。命令中写入以下语句： <br>BACKUP&nbsp;DATABASE&nbsp;[数据库名]&nbsp;TO&nbsp;&nbsp;DISK&nbsp;=&nbsp;N’F:\data\数据库备份’&nbsp;WITH&nbsp;&nbsp;NOINIT&nbsp;,&nbsp;&nbsp;NOUNLOAD&nbsp;,&nbsp;&nbsp;NAME&nbsp;=&nbsp;N’数据库&nbsp;备份’,&nbsp;&nbsp;NOSKIP&nbsp;,&nbsp;&nbsp;STATS&nbsp;=&nbsp;10,&nbsp;&nbsp;NOFORMAT <br>注意：需要修改的地方，数据库名，DISK＝（这里需要填写路径和你的数据库备份的名称）后面的Name＝可以随便填写。 <br>&nbsp;&nbsp;&nbsp;&nbsp;4、点击调度标签，进入调度面板，新建调度，名称随便填写，选择反复出现，点更改可以选择你想要执行任务的随意调度。如每天，每2天，每星期，每月等。根据需要自己设置；&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;5、确定后，不要忘记一件事情，在你刚才建立的工作上点右键，启动工作，如果你的工作没有问题，将会提示执行成功，并有相对应的备份文件在你的磁盘上出现；&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;6、还有一个重要的问题就是你的sql&nbsp;server&nbsp;agent服务器已经启动。 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;如果我们需要根据每天的日期来生成一个新的备份，以便我们区别备份文件。这时，我们需要修改一下刚才的sql语句。参考实例：&nbsp;declare&nbsp;@filename&nbsp;nvarchar(100)&nbsp;set&nbsp;@filename=’F:\AddIn\备份\data’+convert(char(10),getdate(),112)&nbsp;print&nbsp;@filename&nbsp;BACKUP&nbsp;DATABASE&nbsp;[addin]&nbsp;TO&nbsp;DISK&nbsp;=&nbsp;@filename&nbsp;WITH&nbsp;NOINIT&nbsp;,&nbsp;NOUNLOAD&nbsp;,&nbsp;NAME&nbsp;=&nbsp;N’addin&nbsp;备份’,&nbsp;NOSKIP&nbsp;,&nbsp;STATS&nbsp;=&nbsp;10,&nbsp;NOFORMAT&nbsp;如果大家还有问题，希望大家留言与我交流。
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[ora-04031问题解决办法_数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2658.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[<br>由于sga太小，导致有碎片。可用增大sga_max_size方法，或者shared_pool_size.&nbsp;

SHARED_POOL_SIZE <br>这个参数指定了共享池的大小，单位是字节。可以接受数字值或者数字后面跟上后缀"K" 或 "M" 。"K"代表千字节, "M"代表兆字节。 
SHARED_POOL_RESERVED_SIZE <br>指定了为共享池内存保留的用于大的连续请求的共享池空间。当共享池碎片强制使 Oracle 查找并释放大块未使用的池来满足当前的请求的时候，这个参数和SHARED_POOL_RESERVED_MIN_ALLOC 参数一起可以用来避免性能下降。 
这个参数理想的值应该大到足以满足任何对保留列表中内存的请求扫描而无需从共享池中刷新对象。既然操作系统内存可以限制共享池的大小，一般来说，你应该设定这个参数为 SHARED_POOL_SIZE 参数的 10% 大小。 
SHARED_POOL_RESERVED_MIN_ALLOC 这个参数的值控制保留内存的分配。如果一个足够尺寸的大块内存在共享池空闲列表中没能找到，内存就从保留列表中分配一块比这个值大的空间。默认的值对于大多数系统来说都足够了。如果你加大这个值，那么Oracle 服务器将允许从这个保留列表中更少的分配并且将从共享池列表中请求更多的内存。这个参数在Oracle 8i 和更高的版本中是隐藏的。提交如下的语句查找这个参数值: SELECT&nbsp;&nbsp;nam.ksppinm&nbsp;NAME,&nbsp;val.ksppstvl&nbsp;VALUE&nbsp;FROM&nbsp;x$ksppi&nbsp;nam,&nbsp;x$ksppsv&nbsp;val&nbsp;&nbsp;WHERE&nbsp;nam.indx&nbsp;=&nbsp;val.indx&nbsp;AND&nbsp;nam.ksppinm&nbsp;LIKE&nbsp;'%shared%'&nbsp;ORDER&nbsp;BY&nbsp;1;10g 注释：Oracle 10g 的一个新特性叫做 "自动内存管理" 允许DBA保留一个共享内存池来分shared pool,buffer cache, java pool 和large pool。一般来说，当数据库需要分配一个大的对象到共享池中并且不能找到连续的可用空间，将自动使用其他SGA结构的空闲空间来增加共享池的大小 。既然空间分配是Oracle自动管理的，ora-4031出错的可能性将大大降低。自动内存管理在初始化参数SGA_TARGET大于0的时候被激活。当前设定可以通过查询v$sga_dynamic_components 视图获得。请参考10g管理手册以得到更多内容 。 
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
    <item>
      <title><![CDATA[如何使用SQL Server 2005 专用管理员连接(DAC)登录到服务器 _数据库 ]]></title>
      <link><![CDATA[http://www.sortol.com/projects/2007-10-10/article2657.shtml]]></link>
      <pubDate><![CDATA[2007-10-10]]></pubDate>
      <source><![CDATA[asp.net教程网]]></source>
      <author><![CDATA[sortol.com]]></author>
      <description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;一&nbsp;什么是DAC <br>&nbsp;&nbsp;&nbsp;SQL&nbsp;Server&nbsp;2005&nbsp;为管理员提供了一种特殊的诊断连接，以供在无法与服务器建立标准连接时使用。即使在&nbsp;SQL&nbsp;Server&nbsp;不响应标准连接请求时，管理员也可以使用这种连接访问&nbsp;SQL&nbsp;Server，以便执行诊断查询并解决问题。命令行界面&nbsp;(sqlcmd)&nbsp;通过使用特殊的管理员开关&nbsp;(-A)，提供并支持这种专用管理员连接&nbsp;(DAC)。 <br>&nbsp;&nbsp;&nbsp;&nbsp;二如何使用DAC登录到服务器 <br>1&nbsp;本机DAC登录&nbsp; <br>命令行方式下执行&nbsp;&nbsp;sqlcmd&nbsp;-A&nbsp;-S&nbsp;sql服务器名 <br>2&nbsp;&nbsp;远程DAC登录 <br>&nbsp;&nbsp;1)&nbsp;打开远程DAC选项 <br>&nbsp;&nbsp;&nbsp;&nbsp;’程序’-&gt;’Sql&nbsp;Server2005’-&gt;&nbsp;&nbsp;’配置工具’-&gt;&nbsp;’Sql&nbsp;Server&nbsp;&nbsp;外围应用配置器’-&gt;&nbsp;’功能的外围应用配置器’-&gt;&nbsp;’DataBase&nbsp;Engine’-&gt;&nbsp;&nbsp;’DAC’&nbsp;-&gt;&nbsp;’启用远程DAC’ <br>&nbsp;&nbsp;2)&nbsp;&nbsp;登录到远程服务器 <br>&nbsp;&nbsp;sqlcmd&nbsp;-A&nbsp;-S&nbsp;192.168.0.1&nbsp;-U&nbsp;sa&nbsp;-P&nbsp;123456 <br>3&nbsp;&nbsp;登录后,&nbsp;可以通过查询动态管理视图来诊断问题
            
            
               &nbsp;<a href='http://www.sortol.com'> asp.net教程</a>]]></description>
    </item>
  </channel>
</rss>
