﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-Matthew的Blog-随笔分类-SQL Server编程</title><link>http://www.cnitblog.com/gffnxk/category/2627.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 20:25:09 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 20:25:09 GMT</pubDate><ttl>60</ttl><item><title>用SQL语句更改数据库名，表名，列名</title><link>http://www.cnitblog.com/gffnxk/archive/2006/06/06/11659.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Tue, 06 Jun 2006 01:41:00 GMT</pubDate><guid>http://www.cnitblog.com/gffnxk/archive/2006/06/06/11659.html</guid><wfw:comment>http://www.cnitblog.com/gffnxk/comments/11659.html</wfw:comment><comments>http://www.cnitblog.com/gffnxk/archive/2006/06/06/11659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gffnxk/comments/commentRss/11659.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gffnxk/services/trackbacks/11659.html</trackback:ping><description><![CDATA[
		<p>参考SQL Server联机丛书的 sp_renamedb与sp_rename<br /><br />一、更改数据库名<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">sp_renamedb<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />更改数据库的名称。<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />语法<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />sp_renamedb </span>
				<span style="COLOR: #ff0000">[</span>
				<span style="COLOR: #ff0000"> @dbname = </span>
				<span style="COLOR: #ff0000">]</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">old_name</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000"> ,<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">[</span>
				<span style="COLOR: #ff0000"> @newname = </span>
				<span style="COLOR: #ff0000">]</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">new_name</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />参数<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #ff0000">[</span>
				<span style="COLOR: #ff0000">@dbname =</span>
				<span style="COLOR: #ff0000">]</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">old_name</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />是数据库的当前名称。old_name 为 sysname 类型，无默认值。<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #ff0000">[</span>
				<span style="COLOR: #ff0000">@newname =</span>
				<span style="COLOR: #ff0000">]</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">new_name</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />是数据库的新名称。new_name 必须遵循标识符规则。new_name 为 sysname 类型，无默认值。<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />返回代码值<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="FONT-WEIGHT: bold; COLOR: #800000">0</span>
				<span style="COLOR: #000000">（成功）或非零数字（失败）<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />权限<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />只有 sysadmin 和 dbcreator 固定服务器角色的成员才能执行 sp_renamedb。<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />示例<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />下例将数据库 accounting 改名为 financial。<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">EXEC</span>
				<span style="COLOR: #000000"> sp_renamedb </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">accounting</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">financial</span>
				<span style="COLOR: #ff0000">'</span>
		</div>
		<p> </p>
		<p>二、更改表名或列名<br /><br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">sp_rename </span>
				<span style="COLOR: #ff0000">[</span>
				<span style="COLOR: #ff0000"> @objname = </span>
				<span style="COLOR: #ff0000">]</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">object_name</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000"> ,<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">[</span>
				<span style="COLOR: #ff0000"> @newname = </span>
				<span style="COLOR: #ff0000">]</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">new_name</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />    </span>
				<span style="COLOR: #ff0000">[</span>
				<span style="COLOR: #ff0000"> , [ @objtype = </span>
				<span style="COLOR: #ff0000">]</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">object_type</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000"> ]<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #808080">/////////////////////////////////////////////</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />A. 重命名表<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />下例将表 customers 重命名为 custs。<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">EXEC</span>
				<span style="COLOR: #000000"> sp_rename </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">customers</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">custs</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />B. 重命名列<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />下例将表 customers 中的列 contact title 重命名为 title。<br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">EXEC</span>
				<span style="COLOR: #000000"> sp_rename </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">customers.[contact title]</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">title</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">, </span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #ff0000">COLUMN</span>
				<span style="COLOR: #ff0000">'</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.cnitblog.com/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
<img src ="http://www.cnitblog.com/gffnxk/aggbug/11659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gffnxk/" target="_blank">matthew</a> 2006-06-06 09:41 <a href="http://www.cnitblog.com/gffnxk/archive/2006/06/06/11659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>还原数据库并移动文件</title><link>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9926.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 29 Apr 2006 06:13:00 GMT</pubDate><guid>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9926.html</guid><wfw:comment>http://www.cnitblog.com/gffnxk/comments/9926.html</wfw:comment><comments>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9926.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/gffnxk/comments/commentRss/9926.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gffnxk/services/trackbacks/9926.html</trackback:ping><description><![CDATA[
		<p>下例还原完整数据库和事务日志，并将已还原的数据库移动到 C:\Program Files\Microsoft SQL Server\MSSQL\Data 目录下。 </p>
		<p>RESTORE DATABASE MyNwind<br />   FROM MyNwind_1<br />   WITH NORECOVERY, <br />      MOVE 'MyNwind' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewNwind.mdf', <br />      MOVE 'MyNwindLog1' TO 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\NewNwind.ldf'<br />RESTORE LOG MyNwind<br />   FROM MyNwindLog1<br />   WITH RECOVERY </p>
		<p>
				<font size="1">
				</font> </p>
<img src ="http://www.cnitblog.com/gffnxk/aggbug/9926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gffnxk/" target="_blank">matthew</a> 2006-04-29 14:13 <a href="http://www.cnitblog.com/gffnxk/archive/2006/04/29/9926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>创建逻辑备份设备</title><link>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9924.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 29 Apr 2006 06:12:00 GMT</pubDate><guid>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9924.html</guid><wfw:comment>http://www.cnitblog.com/gffnxk/comments/9924.html</wfw:comment><comments>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gffnxk/comments/commentRss/9924.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gffnxk/services/trackbacks/9924.html</trackback:ping><description><![CDATA[
		<p>-- Create a logical backup device for the full MyNwind backup.<br />USE master<br />EXEC sp_addumpdevice 'disk', <font face="Courier New">'MyNwind</font>_1', <br />   DISK ='c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_1.dat' </p>
		<p>-- Back up the full MyNwind database.<br />BACKUP DATABASE MyNwind TO MyNwind_1 </p>
		<p> </p>
<img src ="http://www.cnitblog.com/gffnxk/aggbug/9924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gffnxk/" target="_blank">matthew</a> 2006-04-29 14:12 <a href="http://www.cnitblog.com/gffnxk/archive/2006/04/29/9924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用SQL SERVER 2000的全文检索功能</title><link>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9921.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 29 Apr 2006 05:31:00 GMT</pubDate><guid>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9921.html</guid><wfw:comment>http://www.cnitblog.com/gffnxk/comments/9921.html</wfw:comment><comments>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gffnxk/comments/commentRss/9921.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gffnxk/services/trackbacks/9921.html</trackback:ping><description><![CDATA[
		<p>1、  打开NorthWind数据库，右键Products表，选择"全文索引表"，"在表上定义全文索引"，为其创建全文目录。在"全文索引向导"中，选择你需要全文查询条件的列（可以是文本或图像），我们选择Productname和QuantityPerUnit列。然后下一步，输入一个新的目录proCatalog，点击下一步。在填充调度一项里，我们暂时不建立填充调度。接着"下一步"，全成全文索引向导。完成后，我们可以看到在"全文目录"里，多了一个全文目录proCatalog。右键proCatalog属性，可以看到其状态、表、调度情况。</p>
		<p> </p>
		<p>2、  右键全文目录proCatalog， "启动完全填充"，系统会出现"全文目录填充成功启动"。</p>
		<p> </p>
		<p>3、  这时，我们可以使用Transact-SQL进行全文检索了，我们使用CONTAINS、FREETEXT等谓词。如：</p>
		<p> </p>
		<p>检索ProductName中，即包含b又包含c的所有列</p>
		<p>SELECT *</p>
		<p>FROM Products</p>
		<p>WHERE CONTAINS(ProductName, '"c*" and "b*" ')</p>
		<p> </p>
		<p>检索ProductName中，即包含chai chang tofu之一的所有列</p>
		<p>SELECT *</p>
		<p>FROM Products</p>
		<p>WHERE FREETEXT(ProductName, 'chai chang tofu ')</p>
		<p> </p>
		<p>我们还可以使用CONTAINSTABLE、FREETEXTTABLE等</p>
		<p> </p>
		<p>4、  我们可以用.NET创建WEB或Form客户端，提供一个良好的全文检索界面，使自己的应用程序得到扩展</p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>参考：<br />全文查询有关的系统存储过程</p>
		<p>（1）启动数据库的全文处理功能（sp_fulltext_datebase）； <br />（2）建立全文目录（sp_fulltext_catalog）； <br />（3）在全文目录中注册需要全文索引的表（sp_fulltext_table）； <br />（4）指出表中需要全文检索的列名（sp_fulltext_column） <br />（5）为表创建全文索引（sp_fulltext_table）； <br />（6）填充全文索引（sp_fulltext_catalog）。</p>
		<p> </p>
		<p> </p>
		<p> </p>
		<p>全文查询支持</p>
		<p>Microsoft? SQL Server? 2000 在接收带全文构造的 Transact-SQL 语句时，使用全文提供程序从 Microsoft 搜索服务检索所需信息。全文构造是 CONTAINS 或 FREETEXT 谓词，或者是 CONTAINSTABLE 或 FREETEXTTABLE 行集函数。如果不知道包含搜索条件的列，全文构造可以在全文索引中引用多列。该进程的流程如下图所示。</p>
		<p> </p>
		<p>
				<br />这一进程涉及的步骤包括： </p>
		<p>应用程序给 SQL Server 实例发送带全文构造的 Transact-SQL 语句。</p>
		<p>SQL Server 关系引擎通过查询系统表验证全文构造，确定全文索引是否覆盖列引用。关系引擎将每个 SQL 语句简化为一系列行集操作，并使用 OLE DB 将这些操作传递给基础组件，通常是存储引擎。关系引擎通过全文提供程序而不是存储引擎，将任何全文构造转换成对行集的请求。请求的行集是满足搜索条件和等级的键集，而这个等级表示每个键的数据满足搜索条件的程度。向全文提供程序发送的行集请求命令包括全文检索条件。</p>
		<p>全文提供程序验证请求并将搜索条件更改为由Microsoft 搜索服务的查询支持组件使用的形式。将请求发送到搜索服务。</p>
		<p>查询支持组件使用搜索引擎组件从全文索引析取所请求的数据。然后以行集的形式将这些数据传递回全文提供程序。</p>
		<p>全文提供程序将这个行集返回给关系引擎。</p>
		<p>关系引擎将它从存储引擎和全文提供程序收到的所有行集进行组合，以生成发送回客户端的最终结果集。 </p>
		<p> </p>
		<p>全文目录和索引</p>
		<p>Microsoft? SQL Server? 2000 全文索引为在字符串数据中进行复杂的词搜索提供有效支持。全文索引存储关于重要词和这些词在特定列中的位置的信息。全文查询利用这些信息，可快速搜索包含具体某个词或一组词的行。</p>
		<p>全文索引包含在全文目录中。每个数据库可以包含一个或多个全文目录。一个目录不能属于多个数据库，而每个目录可以包含一个或多个表的全文索引。一个表只能有一个全文索引，因此每个有全文索引的表只属于一个全文目录。</p>
		<p>全文目录和索引不存储在它们所属的数据库中。目录和索引由 Microsoft 搜索服务分开管理。</p>
		<p>全文索引必须在基表上定义，而不能在视图、系统表或临时表上定义。 全文索引的定义包括： </p>
		<p>能唯一标识表中各行的列（主键或候选键），而且不允许 NULL 值。</p>
		<p>索引所覆盖的一个或多个字符串列。 </p>
		<p>全文索引由键值填充。每个键的项提供与该键相关联的重要词（干扰词或终止词除外）、它们所在的列和它们在列中的位置等有关信息。</p>
		<p>格式化文本字符串（如 Microsoft? Word? 文档文件或 HTML 文件）不能存储在字符串或 Unicode 列中，因为这些文件中的许多字节包含不构成有效字符的数据结构。数据库应用程序可能仍需要访问这些数据并对其应用全文检索。因为 image 列并不要求每一字节都构成一个有效字符，所以许多站点将这类数据存储在 image 列中。SQL Server 2000 引入了对存储在 image 列中的这些类型的数据执行全文检索的能力。SQL Server 2000 提供筛选，可从 Microsoft Office? 文件（.doc、.xls 和 .ppt 文件）、文本文件（.txt 文件）及 HTML 文件（.htm 文件）中析取文本化数据。设计表时除包括保存数据的 image 列外，还需包括绑定列来保存存储在 image 列中的数据格式的文件扩展名。可以创建引用 image 列和绑定列的全文索引，以便在存储于 image 列中的文本化信息上启用全文检索。SQL Server 2000 全文检索引擎使用绑定列中的文件扩展名信息，选择从列中析取文本化数据的合适的筛选。</p>
		<p>全文索引是用于执行两个 Transact-SQL 谓词的组件，以便根据全文检索条件对行进行测试： </p>
		<p>CONTAINS</p>
		<p>FREETEXT </p>
		<p>Transact-SQL 还包含两个返回符合全文检索条件的行集的函数： </p>
		<p>CONTAINSTABLE</p>
		<p>FREETEXTTABLE </p>
		<p>SQL Server 在内部将搜索条件发送给 Microsoft 搜索服务。Microsoft 搜索服务查找所有符合全文检索条件的键并将它们返回给 SQL Server。SQL Server 随后使用键的列表来确定表中要处理的行。</p>
		<p>全文索引</p>
		<p>对 Microsoft? SQL Server? 2000 数据的全文支持涉及两个功能：对字符数据发出查询的能力和创建及维护基础索引以简化这些查询的能力。</p>
		<p>全文索引在许多地方与普通的 SQL 索引不同。</p>
		<p>普通 SQL 索引<br /> 全文索引<br /> <br />存储时受定义它们所在的数据库的控制。<br /> 存储在文件系统中，但通过数据库管理。<br /> <br />每个表允许有若干个普通索引。<br /> 每个表只允许有一个全文索引。<br /> <br />当对作为其基础的数据进行插入、更新或删除时，它们自动更新。<br /> 将数据添加到全文索引称为填充，全文索引可通过调度或特定请求来请求，也可以在添加新数据时自动发生。<br /> <br />不分组。<br /> 在同一个数据库内分组为一个或多个全文目录。<br /> <br />使用 SQL Server 企业管理器、向导或 Transact-SQL 语句创建和除去。<br /> 使用 SQL Server 企业管理器、向导或存储过程创建、管理和除去。<br /> </p>
		<p>
				<br /> </p>
		<p>这些差异使大量管理任务变得不可缺少。全文管理是在几个层次上实施的： </p>
		<p>服务器 </p>
		<p>可以对服务器范围的某些属性（如 resource_usage）加以设置，以便增加或减少全文服务所使用的系统资源数量。</p>
		<p>
				<br />说明  全文引擎作为名为 Microsoft 搜索的服务在 Microsoft Windows NT? Server 和 Microsoft Windows? 2000 Server 上运行。对于 Microsoft SQL Server 个人版，Microsoft 搜索服务不可用。尽管这意味着 Microsoft 搜索服务既未安装在 Microsoft Windows 95/98 上，也未安装在 Windows NT 工作站或 Windows 2000 Professional 客户端上，但这些客户端在连接到 SQL Server 标准版安装或企业版实例时可以使用这项服务。</p>
		<p>数据库 </p>
		<p>必须启用数据库才能使用全文服务。可以在已启用的数据库中创建和除去一个或多个全文目录的元数据。</p>
		<p>全文目录 </p>
		<p>全文目录包含数据库中的全文索引。每个目录可以用于数据库内的一个或多个表的索引需求。该目录中的索引是使用这里介绍的管理功能来填充的。（全文目录必须驻留在与 SQL Server 实例相关联的本地硬盘驱动器上。不支持可移动的驱动器、软盘和网络驱动器）。在每个服务器上最多可创建 256 个全文目录。</p>
		<p>
				<br />说明  Windows NT 故障转移群集环境完全支持全文索引。有关更多信息，请参见在故障转移群集中运行全文查询。</p>
		<p>表 </p>
		<p>首先，必须为全文支持启用表。然后，为与该表相关联的全文索引创建元数据（如表名及其全文目录）。表启用后，可以用为全文支持而启用的列中的数据填充它。如果表的全文定义被更改（例如，添加一个也将为全文检索而索引的新列），则必须重新填充相关的全文目录以使全文索引与新的全文定义同步。</p>
		<p>列 </p>
		<p>可以从非活动的注册表中添加或除去支持全文查询的列。</p>
		<p>在所有这些级别上，可使用工具检索元数据和状态信息。</p>
		<p>和常规 SQL 索引一样，当在相关表中修改数据时，可自动更新全文索引。或者，也可以适当的间隔手工重新填充全文索引。这种重写可能既耗时又大量占用资源，因此，在数据库活动较少时，这通常是在后台运行的异步进程。</p>
		<p>应将具有相同更新特性的表（如更改少的与更改多的，或在一天的特定时段内频繁更改的表）组合在一起，并分配给相同的全文目录。通过以此方法设置全文目录填充调度，使得全文索引和表保持同步，且在数据库活动较多时不对数据库服务器的资源使用产生负面影响。</p>
		<p>为全文目录中的表安排全文索引的位置是非常重要的。在为全文目录指定表时，应该注意下列基本原则： </p>
		<p>始终选择可用于全文唯一键的最小唯一索引。（4 个字节且基于整数的索引是最佳的。）这将显著减少文件系统中 Microsoft 搜索服务所需要的资源。如果主键很大（超过 100 字节），可以考虑选择表中其它唯一索引（或创建另一个唯一索引）作为全文唯一键。否则，如果全文唯一键的大小达到允许的上限（450 字节），全文填充将无法继续进行。</p>
		<p>如果进行索引的表有成千上万行，请将该表指定给其自己的全文目录。</p>
		<p>应该考虑对其进行全文索引的表中发生的更改数以及表的行数。如果要更改的总行数，加上上次全文填充期间表中出现的行数达到成千上万行，请将该表指定给其自己的全文目录。 </p>
		<p>请参见</p>
		<p>sp_fulltext_table</p>
		<p>CONTAINS</p>
		<p>一个谓词，用于搜索包含基于字符的数据类型的列，该列与单个词和短语，以及与另一个词一定范围之内的近似词精确或模糊（不太精确的）匹配或者加权匹配。CONTAINS 可以搜索： </p>
		<p>词或短语。</p>
		<p>词或短语的前缀。</p>
		<p>另一个词附近的词。</p>
		<p>由另一个词的词尾变化生成的词（例如，词 drive 是 drives、drove、driving 和 driven 词尾变化的词干）。</p>
		<p>比另一个词具有更高加权的词。 </p>
		<p>语法<br />CONTAINS<br />    ( { column | * } , '&lt; contains_search_condition &gt;'     ) </p>
		<p> </p>
		<p>FREETEXT</p>
		<p>是个谓词，用于搜索含有基于字符的数据类型的列，其中的值符合在搜索条件中所指定文本的含义，但不符合表达方式。使用 FREETEXT 时，全文查询引擎内部将 freetext_string 拆分为若干个搜索词，并赋予每个词以不同的加权，然后查找匹配。</p>
		<p>语法</p>
		<p>FREETEXT ( { column | * } , 'freetext_string' )</p>
		<p> </p>
		<p>CONTAINSTABLE 和 FREETEXTTABLE 函数用来指定返回每行的相对排名的全文查询。这两个函数与全文谓词 CONTAINS 和 FREETEXT 很相似，但是用法不同。</p>
<img src ="http://www.cnitblog.com/gffnxk/aggbug/9921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gffnxk/" target="_blank">matthew</a> 2006-04-29 13:31 <a href="http://www.cnitblog.com/gffnxk/archive/2006/04/29/9921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server中执行外部命令</title><link>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9917.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 29 Apr 2006 05:23:00 GMT</pubDate><guid>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9917.html</guid><wfw:comment>http://www.cnitblog.com/gffnxk/comments/9917.html</wfw:comment><comments>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gffnxk/comments/commentRss/9917.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gffnxk/services/trackbacks/9917.html</trackback:ping><description><![CDATA[
		<p>举例<br />Master..xp_CMDShell 'cmd /c g:\project1.exe'</p>
		<p>
				<br />Master.xp_CMDShell 'dir c:\windows\*.exe &gt; c:\1.txt'</p>
		<p>//注：要执行的EXE文件要能自行退出；<br /></p>
<img src ="http://www.cnitblog.com/gffnxk/aggbug/9917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gffnxk/" target="_blank">matthew</a> 2006-04-29 13:23 <a href="http://www.cnitblog.com/gffnxk/archive/2006/04/29/9917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL语句导入导出大全</title><link>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9916.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 29 Apr 2006 05:21:00 GMT</pubDate><guid>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9916.html</guid><wfw:comment>http://www.cnitblog.com/gffnxk/comments/9916.html</wfw:comment><comments>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gffnxk/comments/commentRss/9916.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gffnxk/services/trackbacks/9916.html</trackback:ping><description><![CDATA[
		<p>SQL语句导入导出大全 </p>
		<p>/*******  导出到excel <br />EXEC master..xp_cmdshell 'bcp SettleDB.dbo.shanghu out c:\temp1.xls -c -q -S"GNETDATA/GNETDATA" -U"sa" -P""' </p>
		<p>/***********  导入Excel <br />SELECT * <br />FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', <br />  'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions </p>
		<p>
				<br />SELECT cast(cast(科目编号 as numeric(10,2)) as nvarchar(255))+'　' 转换后的别名 <br />FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', <br />  'Data Source="c:\test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions </p>
		<p>/** 导入文本文件 <br />EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword' </p>
		<p>/** 导出文本文件 <br />EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword' <br />或 <br />EXEC master..xp_cmdshell 'bcp "Select * from dbname..tablename" queryout c:\DT.txt -c -Sservername -Usa -Ppassword' </p>
		<p>导出到TXT文本，用逗号分开 <br />exec master..xp_cmdshell 'bcp "库名..表名" out "d:\tt.txt" -c -t ,-U sa -P password' </p>
		<p>
				<br />BULK INSERT 库名..表名 <br />FROM 'c:\test.txt' <br />WITH ( <br />    FIELDTERMINATOR = ';', <br />    ROWTERMINATOR = '\n' <br />) </p>
		<p>
				<br />--/* dBase IV文件 <br />select * from <br />OPENROWSET('MICROSOFT.JET.OLEDB.4.0' <br />,'dBase IV;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料4.dbf]') <br />--*/ </p>
		<p>--/* dBase III文件 <br />select * from <br />OPENROWSET('MICROSOFT.JET.OLEDB.4.0' <br />,'dBase III;HDR=NO;IMEX=2;DATABASE=C:\','select * from [客户资料3.dbf]') <br />--*/ </p>
		<p>--/* FoxPro 数据库 <br />select * from openrowset('MSDASQL', <br />'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', <br />'select * from [aa.DBF]') <br />--*/ </p>
		<p>/**************导入DBF文件****************/ <br />select * from openrowset('MSDASQL', <br />'Driver=Microsoft Visual FoxPro Driver; <br />SourceDB=e:\VFP98\data; <br />SourceType=DBF', <br />'select * from customer where country != "USA" order by country') <br />go <br />/***************** 导出到DBF ***************/ <br />如果要导出数据到已经生成结构(即现存的)FOXPRO表中,可以直接用下面的SQL语句 </p>
		<p>insert into openrowset('MSDASQL', <br />'Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=c:\', <br />'select * from [aa.DBF]') <br />select * from 表 </p>
		<p>说明: <br />SourceDB=c:\  指定foxpro表所在的文件夹 <br />aa.DBF        指定foxpro表的文件名. </p>
		<p> </p>
		<p>
				<br />/*************导出到Access********************/ <br />insert into openrowset('Microsoft.Jet.OLEDB.4.0', <br />   'x:\A.mdb';'admin';'',A表) select * from 数据库名..B表 </p>
		<p>/*************导入Access********************/ <br />insert into B表 selet * from openrowset('Microsoft.Jet.OLEDB.4.0', <br />   'x:\A.mdb';'admin';'',A表) </p>
		<p>*********************  导入 xml　文件 </p>
		<p>DECLARE @idoc int <br />DECLARE @doc varchar(1000) <br />--sample XML document <br />SET @doc =' <br />&lt;root&gt; <br />  &lt;Customer cid= "C1" name="Janine" city="Issaquah"&gt; <br />      &lt;Order oid="O1" date="1/20/1996" amount="3.5" /&gt; <br />      &lt;Order oid="O2" date="4/30/1997" amount="13.4"&gt;Customer was very satisfied <br />      &lt;/Order&gt; <br />   &lt;/Customer&gt; <br />   &lt;Customer cid="C2" name="Ursula" city="Oelde" &gt; <br />      &lt;Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue <br />             white red"&gt; <br />            &lt;Urgency&gt;Important&lt;/Urgency&gt; <br />            Happy Customer. <br />      &lt;/Order&gt; <br />      &lt;Order oid="O4" date="1/20/1996" amount="10000"/&gt; <br />   &lt;/Customer&gt; <br />&lt;/root&gt; <br />' <br />-- Create an internal representation of the XML document. <br />EXEC sp_xml_preparedocument @idoc OUTPUT, @doc </p>
		<p>-- Execute a SELECT statement using OPENXML rowset provider. <br />SELECT * <br />FROM OPENXML (@idoc, '/root/Customer/Order', 1) <br />      WITH (oid     char(5), <br />            amount  float, <br />            comment ntext 'text()') <br />EXEC sp_xml_removedocument @idoc </p>
		<p>
				<br />/********************导整个数据库*********************************************/ </p>
		<p>用bcp实现的存储过程 </p>
		<p>
				<br />/* <br /> 实现数据导入/导出的存储过程 <br />         根据不同的参数,可以实现导入/导出整个数据库/单个表 <br /> 调用示例: <br />--导出调用示例 <br />----导出单个表 <br />exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',1 <br />----导出整个数据库 <br />exec file2table 'zj','','','xzkh_sa','C:\docman',1 </p>
		<p>--导入调用示例 <br />----导入单个表 <br />exec file2table 'zj','','','xzkh_sa..地区资料','c:\zj.txt',0 <br />----导入整个数据库 <br />exec file2table 'zj','','','xzkh_sa','C:\docman',0 </p>
		<p>*/ <br />if exists(select 1 from sysobjects where name='File2Table' and objectproperty(id,'IsProcedure')=1) <br /> drop procedure File2Table <br />go <br />create procedure File2Table <br />@servername varchar(200)  --服务器名 <br />,@username varchar(200)   --用户名,如果用NT验证方式,则为空'' <br />,@password varchar(200)   --密码 <br />,@tbname varchar(500)   --数据库.dbo.表名,如果不指定:.dbo.表名,则导出数据库的所有用户表 <br />,@filename varchar(1000)  --导入/导出路径/文件名,如果@tbname参数指明是导出整个数据库,则这个参数是文件存放路径,文件名自动用表名.txt <br />,@isout bit      --1为导出,0为导入 <br />as <br />declare @sql varchar(8000) </p>
		<p>if @tbname like '%.%.%' --如果指定了表名,则直接导出单个表 <br />begin <br /> set @sql='bcp <a href="mailto:'+@tbname">'+@tbname</a><br />  +case when @isout=1 then ' out ' else ' in ' end <br />  +' "<a href="mailto:'+@filename+'">'+@filename+'</a>" /w' <br />  +' /S <a href="mailto:'+@servername">'+@servername</a><br />  +case when isnull(@username,'')='' then '' else ' /U <a href="mailto:'+@username">'+@username</a> end <br />  +' /P '+isnull(@password,'') <br /> exec master..xp_cmdshell @sql <br />end <br />else <br />begin --导出整个数据库,定义游标,取出所有的用户表 <br /> declare @m_tbname varchar(250) <br /> if right(@filename,1)&lt;&gt;'\' set @filename=@filename+'\' </p>
		<p> set @m_tbname='declare #tb cursor for select name from <a href="mailto:'+@tbname+'..sysobjects">'+@tbname+'..sysobjects</a> where xtype=''U''' <br /> exec(@m_tbname) <br /> open #tb <br /> fetch next from #tb into @m_tbname <br /> while @@fetch_status=0 <br /> begin <br />  set @sql='bcp <a href="mailto:'+@tbname+'..'+@m_tbname">'+@tbname+'..'+@m_tbname</a><br />   +case when @isout=1 then ' out ' else ' in ' end <br />   +' "<a href="mailto:'+@filename+@m_tbname+'.txt">'+@filename+@m_tbname+'.txt</a> " /w' <br />   +' /S <a href="mailto:'+@servername">'+@servername</a><br />   +case when isnull(@username,'')='' then '' else ' /U <a href="mailto:'+@username">'+@username</a> end <br />   +' /P '+isnull(@password,'') <br />  exec master..xp_cmdshell @sql <br />  fetch next from #tb into @m_tbname <br /> end <br /> close #tb <br /> deallocate #tb  <br />end <br />go </p>
		<p>
				<br />/**********************Excel导到Txt****************************************/ <br />想用 <br />select * into opendatasource(...) from opendatasource(...) <br />实现将一个Excel文件内容导入到一个文本文件 </p>
		<p>假设Excel中有两列，第一列为姓名，第二列为很行帐号(16位) <br />且银行帐号导出到文本文件后分两部分，前8位和后8位分开。 </p>
		<p>
				<br />如果要用你上面的语句插入的话,文本文件必须存在,而且有一行:姓名,银行账号1,银行账号2 <br />然后就可以用下面的语句进行插入 <br />注意文件名和目录根据你的实际情况进行修改. </p>
		<p>insert into <br />opendatasource('MICROSOFT.JET.OLEDB.4.0' <br />,'Text;HDR=Yes;DATABASE=C:\' <br />)...[aa#txt] <br />--,aa#txt) <br />--*/ <br />select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br />from <br />opendatasource('MICROSOFT.JET.OLEDB.4.0' <br />,'Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls' <br />--,Sheet1$) <br />)...[Sheet1$] </p>
		<p>如果你想直接插入并生成文本文件,就要用bcp </p>
		<p>declare @sql varchar(8000),@tbname varchar(50) </p>
		<p>--首先将excel表内容导入到一个全局临时表 <br />select @tbname='[##temp'+cast(newid() as varchar(40))+']' <br /> ,@sql='select 姓名,银行账号1=left(银行账号,8),银行账号2=right(银行账号,8) <br />into <a href="mailto:'+@tbname+'">'+@tbname+'</a> from <br />opendatasource(''MICROSOFT.JET.OLEDB.4.0'' <br />,''Excel 5.0;HDR=YES;IMEX=2;DATABASE=c:\a.xls'' <br />)...[Sheet1$]' <br />exec(@sql) </p>
		<p>--然后用bcp从全局临时表导出到文本文件 <br />set @sql='bcp "<a href="mailto:'+@tbname+'">'+@tbname+'</a>" out "c:\aa.txt" /S"(local)" /P"" /c' <br />exec master..xp_cmdshell @sql </p>
		<p>--删除临时表 <br />exec('drop table <a href="mailto:'+@tbname">'+@tbname</a>) </p>
		<p>
				<br />用bcp将文件导入导出到数据库的存储过程: </p>
		<p>
				<br />/*--bcp-二进制文件的导入导出 </p>
		<p> 支持image,text,ntext字段的导入/导出 <br /> image适合于二进制文件;text,ntext适合于文本数据文件 </p>
		<p> 注意:导入时,将覆盖满足条件的所有行 <br />  导出时,将把所有满足条件的行也出到指定文件中 </p>
		<p> 此存储过程仅用bcp实现 <br />邹建 2003.08-----------------*/ </p>
		<p>/*--调用示例 <br />--数据导出 <br /> exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat' </p>
		<p>--数据导出 <br /> exec p_binaryIO 'zj','','','acc_演示数据..tb','img','c:\zj1.dat','',0 <br />--*/ <br />if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_binaryIO]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) <br />drop procedure [dbo].[p_binaryIO] <br />GO </p>
		<p>Create proc p_binaryIO <br />@servename varchar (30),--服务器名称 <br />@username varchar (30), --用户名 <br />@password varchar (30), --密码 <br />@tbname varchar (500),  --数据库..表名 <br />@fdname varchar (30),  --字段名 <br />@fname varchar (1000), --目录+文件名,处理过程中要使用/覆盖:@filename+.bak <br />@tj varchar (1000)='',  --处理条件.对于数据导入,如果条件中包含@fdname,请指定表名前缀 <br />@isout bit=1   --1导出((默认),0导入 <br />AS <br />declare @fname_in varchar(1000) --bcp处理应答文件名 <br /> ,@fsize varchar(20)   --要处理的文件的大小 <br /> ,@m_tbname varchar(50)  --临时表名 <br /> ,@sql varchar(8000) </p>
		<p>--则取得导入文件的大小 <br />if @isout=1 <br /> set @fsize='0' <br />else <br />begin <br /> create table #tb(可选名 varchar(20),大小 int <br />  ,创建日期 varchar(10),创建时间 varchar(20) <br />  ,上次写操作日期 varchar(10),上次写操作时间 varchar(20) <br />  ,上次访问日期 varchar(10),上次访问时间 varchar(20),特性 int) <br /> insert into #tb <br /> exec master..xp_getfiledetails @fname <br /> select @fsize=大小 from #tb <br /> drop table #tb <br /> if @fsize is null <br /> begin <br />  print '文件未找到' <br />  return <br /> end </p>
		<p>end </p>
		<p>--生成数据处理应答文件 <br />set @m_tbname='[##temp'+cast(newid() as varchar(40))+']' <br />set @sql='select * into <a href="mailto:'+@m_tbname+'">'+@m_tbname+'</a> from( <br /> select null as 类型 <br /> union all select 0 as 前缀 <br /> union all select <a href="mailto:'+@fsize+'">'+@fsize+'</a> as 长度 <br /> union all select null as 结束 <br /> union all select null as 格式 <br /> ) a' <br />exec(@sql) <br />select @fname_in=@fname+'_temp' <br /> ,@sql='bcp "<a href="mailto:'+@m_tbname+'">'+@m_tbname+'</a>" out "<a href="mailto:'+@fname_in">'+@fname_in</a><br /> +'" /S"<a href="mailto:'+@servename">'+@servename</a><br /> +case when isnull(@username,'')='' then '' <br />  else '" /U"<a href="mailto:'+@username">'+@username</a> end <br /> +'" /P"'+isnull(@password,'')+'" /c' <br />exec master..xp_cmdshell @sql <br />--删除临时表 <br />set @sql='drop table <a href="mailto:'+@m_tbname">'+@m_tbname</a><br />exec(@sql) </p>
		<p>if @isout=1 <br />begin <br /> set @sql='bcp "select top 1 <a href="mailto:'+@fdname+'">'+@fdname+'</a> from ' <br />  <a href="mailto:+@tbname+case">+@tbname+case</a> isnull(@tj,'') when '' then '' <br />   else ' where <a href="mailto:'+@tj">'+@tj</a> end <br />  +'" queryout "<a href="mailto:'+@fname">'+@fname</a><br />  +'" /S"<a href="mailto:'+@servename">'+@servename</a><br />  +case when isnull(@username,'')='' then '' <br />   else '" /U"<a href="mailto:'+@username">'+@username</a> end <br />  +'" /P"'+isnull(@password,'') <br />  +'" /i"<a href="mailto:'+@fname_in+'&quot;'">'+@fname_in+'"'</a><br /> exec master..xp_cmdshell @sql <br />end <br />else <br />begin <br /> --为数据导入准备临时表 <br /> set @sql='select top 0 <a href="mailto:'+@fdname+'">'+@fdname+'</a> into ' <br />  <a href="mailto:+@m_tbname+'">+@m_tbname+'</a> from ' <a href="mailto:+@tbname">+@tbname</a><br /> exec(@sql) </p>
		<p> --将数据导入到临时表 <br /> set @sql='bcp "<a href="mailto:'+@m_tbname+'">'+@m_tbname+'</a>" in "<a href="mailto:'+@fname">'+@fname</a><br />  +'" /S"<a href="mailto:'+@servename">'+@servename</a><br />  +case when isnull(@username,'')='' then '' <br />   else '" /U"<a href="mailto:'+@username">'+@username</a> end <br />  +'" /P"'+isnull(@password,'') <br />  +'" /i"<a href="mailto:'+@fname_in+'&quot;'">'+@fname_in+'"'</a><br /> exec master..xp_cmdshell @sql <br />  <br /> --将数据导入到正式表中 <br /> set @sql='update <a href="mailto:'+@tbname">'+@tbname</a><br />  +' set <a href="mailto:'+@fdname+'=b.'+@fdname">'+@fdname+'=b.'+@fdname</a><br />  +' from <a href="mailto:'+@tbname+'">'+@tbname+'</a> a,' <br />  <a href="mailto:+@m_tbname+'">+@m_tbname+'</a> b' <br />  +case isnull(@tj,'') when '' then '' <br />   else ' where <a href="mailto:'+@tj">'+@tj</a> end <br /> exec(@sql) </p>
		<p> --删除数据处理临时表 <br /> set @sql='drop table <a href="mailto:'+@m_tbname">'+@m_tbname</a><br />end </p>
		<p>--删除数据处理应答文件 <br />set @sql='del <a href="mailto:'+@fname_in">'+@fname_in</a><br />exec master..xp_cmdshell @sql </p>
		<p>go </p>
		<p>
				<br />/** 导入文本文件 <br />EXEC master..xp_cmdshell 'bcp "dbname..tablename" in c:\DT.txt -c -Sservername -Usa -Ppassword' </p>
		<p>改为如下，不需引号 <br />EXEC master..xp_cmdshell 'bcp dbname..tablename in c:\DT.txt -c -Sservername -Usa -Ppassword' </p>
		<p>/** 导出文本文件 <br />EXEC master..xp_cmdshell 'bcp "dbname..tablename" out c:\DT.txt -c -Sservername -Usa -Ppassword' <br />此句需加引号   <br /></p>
<img src ="http://www.cnitblog.com/gffnxk/aggbug/9916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gffnxk/" target="_blank">matthew</a> 2006-04-29 13:21 <a href="http://www.cnitblog.com/gffnxk/archive/2006/04/29/9916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Server 中日期的处理</title><link>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9915.html</link><dc:creator>matthew</dc:creator><author>matthew</author><pubDate>Sat, 29 Apr 2006 05:19:00 GMT</pubDate><guid>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9915.html</guid><wfw:comment>http://www.cnitblog.com/gffnxk/comments/9915.html</wfw:comment><comments>http://www.cnitblog.com/gffnxk/archive/2006/04/29/9915.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/gffnxk/comments/commentRss/9915.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/gffnxk/services/trackbacks/9915.html</trackback:ping><description><![CDATA[
		<p>通常，你需要获得当前日期和计算一些其他的日期，例如，你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割（年、月、日等），然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期！在这篇文章里，我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。   <br />      在使用本文中的例子之前，你必须注意以下的问题。大部分可能不是所有例子在不同的机器上执行的结果可能不一样，这完全由哪一天是一个星期的第一天这个设置决定。第一天（DATEFIRST）设定决定了你的系统使用哪一天作为一周的第一天。所有以下的例子都是以星期天作为一周的第一天来建立，也就是第一天设置为7。假如你的第一天设置不一样，你可能需要调整这些例子，使它和不同的第一天设置相符合。你可以通过@@DATEFIRST函数来检查第一天设置。   </p>
		<p>      为了理解这些例子，我们先复习一下DATEDIFF和DATEADD函数。DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。要了解更多的DATEDIFF和DATEADD函数以及时间间隔可以阅读微软联机帮助。   </p>
		<p>      使用DATEDIFF和DATEADD函数来计算日期，和本来从当前日期转换到你需要的日期的考虑方法有点不同。你必须从时间间隔这个方面来考虑。比如，从当前日期到你要得到的日期之间有多少时间间隔，或者，从今天到某一天（比如1900-1-1）之间有多少时间间隔，等等。理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。   </p>
		<p>一个月的第一天   </p>
		<p>      第一个例子，我将告诉你如何从当前日期去这个月的最后一天。请注意：这个例子以及这篇文章中的其他例子都将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。每一个例子都将通过计算但前的时间间隔，然后进行加减来得到想要计算的日期。   </p>
		<p>      这是计算一个月第一天的SQL  脚本：   <br />      SELECT  DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0)   </p>
		<p>      我们把这个语句分开来看看它是如何工作的。最核心的函数是getdate()，大部分人都知道这个是返回当前的日期和时间的函数。下一个执行的函数DATEDIFF(mm,0,getdate())是计算当前日期和"1900-01-01  00:00:00.000"这个日期之间的月数。记住：时期和时间变量和毫秒一样是从"1900-01-01  00:00:00.000"开始计算的。这就是为什么你可以在DATEDIFF函数中指定第一个时间表达式为"0"。下一个函数是DATEADD，增加当前日期到"1900-01-01"的月数。通过增加预定义的日期"1900-01-01"和当前日期的月数，我们可以获得这个月的第一天。另外，计算出来的日期的时间部分将会是"00:00:00.000"。   </p>
		<p>      这个计算的技巧是先计算当前日期到"1900-01-01"的时间间隔数，然后把它加到"1900-01-01"上来获得特殊的日期，这个技巧可以用来计算很多不同的日期。下一个例子也是用这个技巧从当前日期来产生不同的日期。   </p>
		<p>   <br />本周的星期一   </p>
		<p>      这里我是用周(wk)的时间间隔来计算哪一天是本周的星期一。   </p>
		<p>      SELECT  DATEADD(wk,  DATEDIFF(wk,0,getdate()),  0)   </p>
		<p>一年的第一天   </p>
		<p>      现在用年(yy)的时间间隔来显示这一年的第一天。   </p>
		<p>      SELECT  DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0)   </p>
		<p>季度的第一天   </p>
		<p>      假如你要计算这个季度的第一天，这个例子告诉你该如何做。   </p>
		<p>      SELECT  DATEADD(qq,  DATEDIFF(qq,0,getdate()),  0)   </p>
		<p>当天的半夜   </p>
		<p>      曾经需要通过getdate()函数为了返回时间值截掉时间部分，就会考虑到当前日期是不是在半夜。假如这样，这个例子使用DATEDIFF和DATEADD函数来获得半夜的时间点。   </p>
		<p>      SELECT  DATEADD(dd,  DATEDIFF(dd,0,getdate()),  0)   </p>
		<p>深入DATEDIFF和DATEADD函数计算   </p>
		<p>      你可以明白，通过使用简单的DATEDIFF和DATEADD函数计算，你可以发现很多不同的可能有意义的日期。   </p>
		<p>      目前为止的所有例子只是仅仅计算当前的时间和"1900-01-01"之间的时间间隔数量，然后把它加到"1900-01-01"的时间间隔上来计算出日期。假定你修改时间间隔的数量，或者使用不同的时间间隔来调用DATEADD函数，或者减去时间间隔而不是增加，那么通过这些小的调整你可以发现和多不同的日期。   </p>
		<p>      这里有四个例子使用另外一个DATEADD函数来计算最后一天来分别替换DATEADD函数前后两个时间间隔。   </p>
		<p>上个月的最后一天   </p>
		<p>      这是一个计算上个月最后一天的例子。它通过从一个月的最后一天这个例子上减去3毫秒来获得。有一点要记住，在Sql  Server中时间是精确到3毫秒。这就是为什么我需要减去3毫秒来获得我要的日期和时间。   </p>
		<p>      SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(mm,0,getdate()),  0))   </p>
		<p>      计算出来的日期的时间部分包含了一个Sql  Server可以记录的一天的最后时刻("23:59:59:997")的时间。   </p>
		<p>去年的最后一天   </p>
		<p>      连接上面的例子，为了要得到去年的最后一天，你需要在今年的第一天上减去3毫秒。   </p>
		<p>      SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0))   </p>
		<p>本月的最后一天   </p>
		<p>      现在，为了获得本月的最后一天，我需要稍微修改一下获得上个月的最后一天的语句。修改需要给用DATEDIFF比较当前日期和"1900-01-01"返回的时间间隔上加1。通过加1个月，我计算出下个月的第一天，然后减去3毫秒，这样就计算出了这个月的最后一天。这是计算本月最后一天的SQL脚本。   </p>
		<p>      SELECT  dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0))   </p>
		<p>本年的最后一天   </p>
		<p>      你现在应该掌握这个的做法，这是计算本年最后一天脚本   </p>
		<p>      SELECT  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate())+1,  0))。   </p>
		<p>本月的第一个星期一   </p>
		<p>      好了，现在是最后一个例子。这里我要计算这个月的第一个星期一。这是计算的脚本。   </p>
		<p>        select  DATEADD(wk,  DATEDIFF(wk,0,                                                           <br />                              dateadd(dd,6-datepart(day,getdate()),getdate())         <br />                                                                                                ),  0)                           </p>
		<p>      在这个例子里，我使用了"本周的星期一"的脚本，并作了一点点修改。修改的部分是把原来脚本中"getdate()"部分替换成计算本月的第6天，在计算中用本月的第6天来替换当前日期使得计算可以获得这个月的第一个星期一。   </p>
		<p>总结   </p>
		<p>      我希望这些例子可以在你用DATEADD和DATEDIFF函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法，我发现为了显示两个日期之间间隔的有用历法是有价值的。注意，这只是计算出这些日期的一种方法。要牢记，还有很多方法可以得到相同的计算结果。假如你有其他的方法，那很不错，要是你没有，我希望这些例子可以给你一些启发，当你要用DATEADD和DATEDIFF函数计算你程序可能要用到的日期时。   </p>
		<p>---------------------------------------------------------------   <br />附录，其他日期处理方法   </p>
		<p>1)去掉时分秒   <br />declare  @  datetime   <br />set  @  =  getdate()  --'2003-7-1  10:00:00'   <br />SELECT  @,DATEADD(day,  DATEDIFF(day,0,@),  0)   </p>
		<p>2）显示星期几   <br />select  datename(weekday,getdate())     </p>
		<p>3）如何取得某个月的天数   <br />declare  @m  int   <br />set  @m=2  --月份   <br />select    datediff(day,'2003-'+cast(@m  as  varchar)+'-15'  ,'2003-'+cast(@m+1    as  varchar)+'-15')   <br />另外，取得本月天数   <br />select    datediff(day,cast(month(GetDate())  as  varchar)+'-'+cast(month(GetDate())  as  varchar)+'-15'  ,cast(month(GetDate())  as  varchar)+'-'+cast(month(GetDate())+1    as  varchar)+'-15')   <br />或者使用计算本月的最后一天的脚本，然后用DAY函数区最后一天   <br />SELECT  Day(dateadd(ms,-3,DATEADD(mm,  DATEDIFF(m,0,getdate())+1,  0)))   </p>
		<p>4）判断是否闰年：   <br />SELECT  case  day(dateadd(mm,  2,  dateadd(ms,-3,DATEADD(yy,  DATEDIFF(yy,0,getdate()),  0))))  when  28  then  '平年'  else  '闰年'  end   <br />或者   <br />select  case  datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01'))   <br />when  28  then  '平年'  else  '闰年'  end   </p>
		<p>5）一个季度多少天   <br />declare  @m  tinyint,@time  smalldatetime   <br />select  @m=month(getdate())   <br />select  @m=case  when  @m  between  1  and  3  then  1   <br />                      when  @m  between  4  and  6  then  4   <br />                      when  @m  between  7  and  9  then  7   <br />                      else  10  end   <br />select  @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'   <br />select  datediff(day,@time,dateadd(mm,3,@time)) <br /></p>
<img src ="http://www.cnitblog.com/gffnxk/aggbug/9915.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/gffnxk/" target="_blank">matthew</a> 2006-04-29 13:19 <a href="http://www.cnitblog.com/gffnxk/archive/2006/04/29/9915.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>