<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[学而时习之 - 数据库]]></title>
<link>http://www.chxwei.com/</link>
<description><![CDATA[学而时习之，不亦说乎？有朋自远方来，不亦乐乎？人不知，而不愠，不亦君子乎？]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[admin@yahoo.cn(Chxwei)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>学而时习之</title>
	<url>http://www.chxwei.com/images/logos.gif</url>
	<link>http://www.chxwei.com/</link>
	<description>学而时习之</description>
</image>

			<item>
			<link>http://www.chxwei.com/article.asp?id=709</link>
			<title><![CDATA[Sql Server存储法语、日语、俄语、西语、阿语等语种出现乱码的解决办法]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Tue,10 Aug 2010 15:09:19 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=709</guid>
		<description><![CDATA[今天公司一个自己写的小系统由Access数据库升级为MSSql数据库，升级之后却出现点问题：保存阿语等小语种的时候出现乱码，都是一些?问号。<br/><br/>在网上找了一些类似的例子，有的说是 排序规则 的问题，修改之后还是不行。<br/><br/>忽然想到是不是Unicode字符串的问题，于是在Google上搜索了一下，果然发现了问题所在：<br/><br/>在 SQL Server 中处理 Unicode 字串串时，必需在所有的 Unicode 字串前加上大写字母 <span style="color:Red">N</span> 做为前置词，原帖在：<a href="http://support.microsoft.com/default.aspx?scid=kb" target="_blank" rel="external">http://support.microsoft.com/default.aspx?scid=kb</a>;zh-tw;239530<br/><br/>于是按照这种思路修改了一下保存的SQL语句，在涉及到是Unicode数据的 nchar、nvarchar 和 ntext 数据类型的前面都加了一个大写的N，例如：<br/>Conn.Execute(&#34;Up&#100;ate NewsList Set Title=<span style="color:Blue">N</span>&#39;&#34;&amp;Title&amp;&#34;&#39;,Content=<span style="color:Blue">N</span>&#39;&#34;&amp;Content&amp;&#34;&#39; Wh&#101;re ID=&#34;&amp;ID)<br/><br/>搞定！]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=678</link>
			<title><![CDATA[Access数据库 自动编号 重置的方法]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Thu,21 Jan 2010 12:31:07 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=678</guid>
		<description><![CDATA[<br/>非常简单：Access数据库 自动编号 重置的方法<br/><br/>把表里的数据全部删除，然后 选择 工具 里的 压缩/修复数据库 即可！<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>太短了]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=651</link>
			<title><![CDATA[SQL 语句收集]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Sat,07 Nov 2009 11:57:11 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=651</guid>
		<description><![CDATA[<br/><br/>说明：复制表(只复制结构，源表名：a，新表名：b) <br/>SQL: sel&#101;ct * into b from a wh&#101;re 1&lt;&gt;1; <br/><br/>说明：拷贝表(拷贝数据，源表名：a，目标表名：b) <br/>SQL: ins&#101;rt into b(a, b, c) sel&#101;ct d, e, f from b; <br/><br/>说明：显示文章、提交人和最后回复时间 <br/>SQL: sel&#101;ct a.title, a.username, b.adddate <br/>&nbsp;&nbsp;&nbsp;&nbsp; from table a,(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel&#101;ct max(adddate) adddate <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from table wh&#101;re table.title=a.title) b<br/><br/>说明：外连接查询(表名1：a，表名2：b) <br/>SQL: sel&#101;ct a.a, a.b, a.c, b.c, b.d, b.f <br/>&nbsp;&nbsp;&nbsp;&nbsp; from a LEFT OUT JOIN b ON a.a = b.c;<br/><br/>说明：日程安排提前五分钟提醒 <br/>SQL: sel&#101;ct * <br/>&nbsp;&nbsp;&nbsp;&nbsp; from 日程安排 <br/>&nbsp;&nbsp;&nbsp;&nbsp; wh&#101;re datediff(’’minute’’, f开始时间, getdate())&gt;5<br/><br/>说明：两张关联表，删除主表中已经在副表中没有的信息 <br/>SQL: del&#101;te from info <br/>&nbsp;&nbsp;&nbsp;&nbsp; wh&#101;re not exists(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sel&#101;ct * <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from infobz <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wh&#101;re info.infid=infobz.infid );<br/><br/><br/>1.按姓氏笔画排序: <br/>Sel&#101;ct * From TableName o&#114;der By CustomerName Collate Chinese_PRC_Stroke_ci_as <br/><br/>2.分页SQL语句 <br/>sel&#101;ct * from(sel&#101;ct (row_number() OVER (ORDER BY tab.ID Desc)) as rownum,tab.* from 表名 As tab) As t wh&#101;re rownum between 起始位置 And 结束位置 <br/><br/>3.获取当前数据库中的所有用户表 <br/>sel&#101;ct * from sysobjects wh&#101;re xtype=&#39;U&#39; and category=0 <br/><br/>4.获取某一个表的所有字段 <br/>sel&#101;ct name from syscolumns wh&#101;re id=object_id(&#39;表名&#39;) <br/><br/>5.查看与某一个表相关的视图、存储过程、函数 <br/>sel&#101;ct a.* from sysobjects a, syscomments b wh&#101;re a.id = b.id and b.text like &#39;%表名%&#39; <br/><br/>6.查看当前数据库中所有存储过程 <br/>sel&#101;ct name as 存储过程名称 from sysobjects wh&#101;re xtype=&#39;P&#39; <br/><br/>7.查询用户创建的所有数据库 <br/>sel&#101;ct * from master..sysdatabases D wh&#101;re sid not in(sel&#101;ct sid from master..syslogins wh&#101;re name=&#39;sa&#39;) <br/>或者 <br/>sel&#101;ct dbid, name AS DB_NAME from master..sysdatabases wh&#101;re sid &lt;&gt; 0x01 <br/><br/>8.查询某一个表的字段和数据类型 <br/>sel&#101;ct column_name,data_type from information_schema.columns <br/>wh&#101;re table_name = &#39;表名&#39; <br/><br/>9.使用事务 <br/>在使用一些对数据库表的临时的SQL语句操作时，可以采用SQL SERVER事务处理，防止对数据操作后发现误操作问题 <br/>开始事务 <br/>Begin tran <br/>&nbsp;&nbsp;Ins&#101;rt Into TableName Values(…) <br/>SQL语句操作不正常，则回滚事务。 <br/>回滚事务 <br/>Rollback tran <br/>SQL语句操作正常，则提交事务，数据提交至数据库。 <br/>提交事务 <br/>Commit tran <br/>10. 按全文匹配方式查询 <br/>字段名 LIKE N&#39;%[^a-zA-Z0-9]China[^a-zA-Z0-9]%&#39; <br/>o&#114; 字段名 LIKE N&#39;%[^a-zA-Z0-9]China&#39; <br/>o&#114; 字段名 LIKE N&#39;China[^a-zA-Z0-9]%&#39; <br/>o&#114; 字段名 LIKE N&#39;China <br/><br/>11．计算执行SQL语句查询时间 <br/>declare @d datetime <br/>set @d=getdate() <br/>sel&#101;ct * from SYS_ColumnProperties sel&#101;ct [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate()) <br/><br/>12、说明：几个高级查询运算词 <br/>A： UNION 运算符 <br/>UNION 运算符通过组合其他两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 <br/>B： EXCEPT 运算符 <br/>EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。 <br/>C： INTERSECT 运算符 <br/>INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。 <br/><br/><br/>计算一个库里各个表的记录总数：<br/>sel&#101;ct b.name,a.rowcnt from sysindexes a,sysobjects b <br/>wh&#101;re a.id=b.id and a.indid&lt;2 and b.xtype=&#39;u&#39;<br/><br/>--统计数据库里每个表的详细情况<br/>&nbsp;&nbsp; EXEC sp_MSforeachtable @command1=&#34;sp_spaceused &#39;?&#39;&#34;<br/><br/>&nbsp;&nbsp; --获得每个表的记录数和容量:<br/>&nbsp;&nbsp; EXEC sp_MSforeachtable @command1=&#34;print &#39;?&#39;&#34;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@command2=&#34;sp_spaceused &#39;?&#39;&#34;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@command3= &#34;Sel&#101;ct count(*) FROM ? &#34;<br/><br/><br/><br/>DECLARE @dt datetime<br/>SET @dt=GETDATE()<br/><br/>DECLARE @number int<br/>SET @number=3<br/><br/>--1．指定日期该年的第一天或最后一天<br/>--A. 年的第一天<br/>Sel&#101;ct CONVERT(char(5),@dt,120)+&#39;1-1&#39;<br/><br/>--B. 年的最后一天<br/>Sel&#101;ct CONVERT(char(5),@dt,120)+&#39;12-31&#39;<br/><br/><br/>--2．指定日期所在季度的第一天或最后一天<br/>--A. 季度的第一天<br/>Sel&#101;ct CONVERT(datetime,<br/>&nbsp;&nbsp;&nbsp;&nbsp;CONVERT(char(8),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATEADD(Month,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATEPART(Quarter,@dt)*3-Month(@dt)-2,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@dt),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120)+&#39;1&#39;)<br/><br/>--B. 季度的最后一天（CASE判断法）<br/>Sel&#101;ct CONVERT(datetime,<br/>&nbsp;&nbsp;&nbsp;&nbsp;CONVERT(char(8),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATEADD(Month,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATEPART(Quarter,@dt)*3-Month(@dt),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@dt),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120)<br/>&nbsp;&nbsp;&nbsp;&nbsp;+CASE WHEN DATEPART(Quarter,@dt) in(1,4)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;THEN &#39;31&#39;ELSE &#39;30&#39; END)<br/><br/>--C. 季度的最后一天（直接推算法）<br/>Sel&#101;ct DATEADD(Day,-1,<br/>&nbsp;&nbsp;&nbsp;&nbsp;CONVERT(char(8),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DATEADD(Month,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1+DATEPART(Quarter,@dt)*3-Month(@dt),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@dt),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;120)+&#39;1&#39;)<br/><br/><br/>--3．指定日期所在月份的第一天或最后一天<br/>--A. 月的第一天<br/>Sel&#101;ct CONVERT(datetime,CONVERT(char(8),@dt,120)+&#39;1&#39;)<br/><br/>--B. 月的最后一天<br/>Sel&#101;ct DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+&#39;1&#39;)<br/><br/>--C. 月的最后一天（容易使用的错误方法）<br/>Sel&#101;ct DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))<br/><br/><br/>--4．指定日期所在周的任意一天<br/>Sel&#101;ct DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)<br/><br/><br/>--5．指定日期所在周的任意星期几<br/>--A.&nbsp;&nbsp;星期天做为一周的第1天<br/>Sel&#101;ct DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)<br/><br/>--B.&nbsp;&nbsp;星期一做为一周的第1天<br/>Sel&#101;ct DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)<br/><br/><br/><br/>1 :普通SQL语句可以用exec执行 <br/><br/>Sel&#101;ct * from tableName <br/>exec(&#39;sel&#101;ct * from tableName&#39;) <br/>exec sp_executesql N&#39;sel&#101;ct * from tableName&#39; -- 请注意字符串前一定要加N <br/><br/>2:字段名，表名，数据库名之类作为变量时，必须用动态SQL <br/><br/>declare @fname varchar(20) <br/>set @fname = &#39;FiledName&#39; <br/>Sel&#101;ct @fname from tableName -- 错误,不会提示错误，但结果为固定值FiledName,并非所要。 <br/>exec(&#39;sel&#101;ct &#39; + @fname + &#39; from tableName&#39;) -- 请注意 加号前后的 单引号的边上加空格 <br/><br/>当然将字符串改成变量的形式也可 <br/>declare @fname varchar(20) <br/>set @fname = &#39;FiledName&#39; --设置字段名 <br/><br/>declare @s varchar(1000) <br/>set @s = &#39;sel&#101;ct &#39; + @fname + &#39; from tableName&#39; <br/>exec(@s) -- 成功 <br/>exec sp_executesql @s -- 此句会报错 <br/><br/>declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) <br/>set @s = &#39;sel&#101;ct &#39; + @fname + &#39; from tableName&#39; <br/>exec(@s) -- 成功 <br/>exec sp_executesql @s -- 此句正确 <br/><br/>3. 输出参数 <br/>declare @num int, @sqls nvarchar(4000) <br/>set @sqls=&#39;sel&#101;ct count(*) from tableName&#39; <br/>exec(@sqls) <br/><br/>--如何将exec执行结果放入变量中？ <br/><br/>declare @num int, @sqls nvarchar(4000) <br/>set @sqls=&#39;sel&#101;ct @a=count(*) from tableName &#39; <br/>exec sp_executesql @sqls,N&#39;@a int output&#39;,@num output <br/>sel&#101;ct @num <br/><br/><br/>1 :普通SQL语句可以用Exec执行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sel&#101;ct * from tableName <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exec(&#39;sel&#101;ct * from tableName&#39;) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exec sp_executesql N&#39;sel&#101;ct * from tableName&#39;&nbsp;&nbsp;&nbsp;&nbsp;-- 请注意字符串前一定要加N <br/><br/>2:字段名，表名，数据库名之类作为变量时，必须用动态SQL <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;错误:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @fname varchar(20) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @fname = &#39;FiledName&#39; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sel&#101;ct @fname from tableName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- 错误,不会提示错误，但结果为固定值FiledName,并非所要。<br/>&nbsp;&nbsp;&nbsp;&nbsp;正确:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exec(&#39;sel&#101;ct &#39; + @fname + &#39; from tableName&#39;)&nbsp;&nbsp;&nbsp;&nbsp; -- 请注意加号前后的单引号的边上加空格<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;当然将字符串改成变量的形式也可<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @fname varchar(20) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @fname = &#39;FiledName&#39; --设置字段名<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @s varchar(1000) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @s = &#39;sel&#101;ct &#39; + @fname + &#39; from tableName&#39; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exec(@s)&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;exec sp_executesql @s&nbsp;&nbsp; -- 此句会报错<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--注：@s参数必须为ntext或nchar或nvarchar类型,必须将declare @s varchar(1000) 改为declare @s Nvarchar(1000) <br/><br/><br/><br/>&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;declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @fname = &#39;FiledName&#39; --设置字段名<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @s = &#39;sel&#101;ct &#39; + @fname + &#39; from tableName&#39; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exec(@s)&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;exec sp_executesql @s&nbsp;&nbsp; -- 此句正确<br/><br/>3. 输入或输出参数<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)输入参数:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @QueryString nvarchar(1000) --动态查询语句变量(注：必须为ntext或nchar哐nvarchar类型，不能是varchar类型)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注：必须为ntext或nchar哐nvarchar类型，不能是varchar类型)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @input_id int--定义需传入动态语句的参数的值<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @QueryString=&#39;sel&#101;ct * from tablename&nbsp;&nbsp;wh&#101;re id=@id&#39;&nbsp;&nbsp;--id为字段名，@id为要传入的参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @paramstring=&#39;@id int&#39; --设置动态语句中参数的定义的字符串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @input_id =1&nbsp;&nbsp;--设置需传入动态语句的参数的值为1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec sp_executesql @querystring,@paramstring,@id=@input_id　　<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若有多个参数:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @QueryString nvarchar(1000) --动态查询语句变量(注：必须为ntext或nchar哐nvarchar类型，不能是varchar类型)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注：必须为ntext或nchar哐nvarchar类型，不能是varchar类型)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @input_id int--定义需传入动态语句的参数的值,参数1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @input_name varchar(20)--定义需传入动态语句的参数的值,参数2<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @QueryString=&#39;sel&#101;ct * from tablename&nbsp;&nbsp;wh&#101;re id=@id and name=@name&#39;&nbsp;&nbsp; --id与name为字段名，@id与@name为要传入的参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @paramstring=&#39;@id int,@name varchar(20)&#39; --设置动态语句中参数的定义的字符串,多个参数用&#34;,&#34;隔开<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @input_id =1&nbsp;&nbsp;--设置需传入动态语句的参数的值为1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @input_name=&#39;张三&#39;&nbsp;&nbsp; --设置需传入动态语句的参数的值为&#34;张三&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name　--请注意参数的顺序<br/>&nbsp;&nbsp;&nbsp;&nbsp; (2)输出参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare @num int, @sqls nvarchar(4000) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @sqls=&#39;sel&#101;ct count(*) from tableName&#39; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec(@sqls) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--如何将exec执行结果放入变量中？&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @QueryString nvarchar(1000) --动态查询语名变量(注：必须为ntext或nchar哐nvarchar类型，不能是varchar类型)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注：必须为ntext或nchar哐nvarchar类型，不能是varchar类型)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @output_result int--查询结果赋给@output_result <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @QueryString=&#39;sel&#101;ct @totalcount=count(*) from tablename&#39; --@totalcount　为输出结果参数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @paramstring=&#39;@totalcount int output&#39; --设置动态语句中参数的定义的字符串,多个参数用&#34;,&#34;隔开<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel&#101;ct @output_result<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然，输入与输出参数可以一起使用，大家可以自己去试一试。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另外，动态语句查询的结果集要输出的话，我只想到以下用临时表的方法，不知各位有没有更好的方法.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IF object_id(&#39;[tempdb].[dbo].#tmp&#39;) IS NOT NULL --判断临时表#tmp是否存在,存在则删除<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dro&#112; table #tmp<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sel&#101;ct * into #tmp from tablename wh&#101;re 1=2 --创建临时表#tmp,其结构与tablename相同<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declare @QueryString nvarchar(1000) --动态查询语名变量(注：必须为ntext或nchar哐nvarchar类型，不能是varchar类型)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set @QueryString=&#39;sel&#101;ct * from tablename &#39;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ins&#101;rt into #tmp(field1,field2,...) exec(@querystirng) <br/><br/><br/><br/><br/>1、说明：复制表(只复制结构,源表名：a 新表名：b) (Access可用) <br/>法一：sel&#101;ct * into b from a wh&#101;re 1 &lt;&gt;1 <br/>法二：sel&#101;ct top 0 * into b from a <br/><br/>2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用) <br/>ins&#101;rt into b(a, b, c) sel&#101;ct d,e,f from a; <br/><br/>3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用) <br/>ins&#101;rt into b(a, b, c) sel&#101;ct d,e,f from b in ‘具体数据库’ wh&#101;re 条件 <br/>例子：..from b in &#39;&#34;&amp;Server.MapPath(&#34;.&#34;)&amp;&#34;\data.mdb&#34; &amp;&#34;&#39; wh&#101;re.. <br/><br/>4、说明：子查询(表名1：a 表名2：b) <br/>sel&#101;ct a,b,c from a wh&#101;re a IN (sel&#101;ct d from b ) 或者: sel&#101;ct a,b,c from a wh&#101;re a IN (1,2,3) <br/><br/>5、说明：显示文章、提交人和最后回复时间 <br/>sel&#101;ct a.title,a.username,b.adddate from table a,(sel&#101;ct max(adddate) adddate from table wh&#101;re table.title=a.title) b <br/><br/>6、说明：外连接查询(表名1：a 表名2：b) <br/>sel&#101;ct a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c <br/><br/>7、说明：在线视图查询(表名1：a ) <br/>sel&#101;ct * from (Sel&#101;ct a,b,c FROM a) T wh&#101;re t.a &gt; 1; <br/><br/>8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括 <br/>sel&#101;ct * from table1 wh&#101;re time between time1 <br/><br/>9、说明：in 的使用方法 <br/>sel&#101;ct * from table1 wh&#101;re a [not] in (‘值1’,’值2’,’值4’,’值6’) <br/><br/>10、说明：两张关联表，删除主表中已经在副表中没有的信息 <br/>del&#101;te from table1 wh&#101;re not exists ( sel&#101;ct * from table2 wh&#101;re table1.field1=table2.field1 ) <br/><br/>11、说明：四表联查问题： <br/>sel&#101;ct * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d wh&#101;re ..... <br/><br/>12、说明：日程安排提前五分钟提醒 <br/>SQL: sel&#101;ct * from 日程安排 wh&#101;re datediff(&#39;minute&#39;,f开始时间,getdate())&gt;5 <br/><br/>13、说明：一条sql 语句搞定数据库分页 <br/>sel&#101;ct top 10 b.* from (sel&#101;ct top 20 主键字段,排序字段 from 表名 o&#114;der by 排序字段 desc) a,表名 b wh&#101;re b.主键字段 = a.主键字段 o&#114;der by a.排序字段 <br/><br/>14、说明：前10条记录 <br/>sel&#101;ct top 10 * form table1 wh&#101;re 范围 <br/><br/>15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) <br/>sel&#101;ct a,b,c from tablename ta wh&#101;re a=(sel&#101;ct max(a) from tablename tb wh&#101;re tb.b=ta.b) <br/><br/>16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表 <br/>(sel&#101;ct a from tableA ) except (sel&#101;ct a from tableB) except (sel&#101;ct a from tableC) <br/><br/>17、说明：随机取出10条数据 <br/>sel&#101;ct top 10 * from tablename o&#114;der by newid() <br/><br/>18、说明：随机选择记录 <br/>sel&#101;ct newid() <br/><br/>19、说明：删除重复记录 <br/>Del&#101;te from tablename wh&#101;re id not in (sel&#101;ct max(id) from tablename group by col1,col2,...) <br/><br/>20、说明：列出数据库里所有的表名 <br/>sel&#101;ct name from sysobjects wh&#101;re type=&#39;U&#39; <br/><br/>21、说明：列出表里的所有的列 <br/>sel&#101;ct name from syscolumns wh&#101;re id=object_id(&#39;TableName&#39;) <br/><br/>22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似sel&#101;ct 中的case。 <br/>sel&#101;ct type,sum(case vender when &#39;A&#39; then pcs else 0 end),sum(case vender when &#39;C&#39; then pcs else 0 end),sum(case vender when &#39;B&#39; then pcs else 0 end) FROM tablename group by type <br/>显示结果： <br/>type vender pcs <br/>电脑 A 1 <br/>电脑 A 1 <br/>光盘 B 2 <br/>光盘 A 2 <br/>手机 B 3 <br/>手机 C 3 <br/><br/>23、说明：初始化表table1 <br/>TRUNCATE TABLE table1 <br/><br/>24、说明：选择从10到15的记录 <br/>sel&#101;ct top 5 * from (sel&#101;ct top 15 * from table o&#114;der by id asc) table_别名 o&#114;der by id desc <br/><br/>declare @a varchar(100),@b varchar(20) <br/>sel&#101;ct @a=&#39;abcdefbcmnbcde&#39;,@b=&#39;bc&#39; <br/>sel&#101;ct (len(@a)-len(replace(@a,@b,&#39;&#39;)))/len(@b)<br/><br/>说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.) <br/>sel&#101;ct a,b,c from tablename ta wh&#101;re a=(sel&#101;ct max(a) from tablename tb wh&#101;re tb.b=ta.b)]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=597</link>
			<title><![CDATA[SQL日期转换]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Sun,08 Mar 2009 11:28:03 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=597</guid>
		<description><![CDATA[<br/>sel&#101;ct CONVERT(varchar, getdate(), 120 )<br/>2009-03-08 12:10:30<br/><br/>sel&#101;ct replace(replace(replace(CONVERT(varchar, getdate(), 120 ),&#39;-&#39;,&#39;&#39;),&#39; &#39;,&#39;&#39;),&#39;:&#39;,&#39;&#39;)<br/>20090308121030<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 111 )<br/>2009/03/08<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 112 )<br/>20090308<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 102 )<br/>2009.03.08<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 101 )<br/>03/08/2009<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 103 )<br/>08/03/2009<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 104 )<br/>08.03.2009<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 105 )<br/>08-03-2009<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 106 )<br/>08 03 2009<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 107 )<br/>03 08, 2009<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 108 )<br/>12:10:30<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 109 )<br/>03 08 2009 1<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 110 )<br/>03-08-2009<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 113 )<br/>08 03 2009 1<br/><br/>sel&#101;ct CONVERT(varchar(12) , getdate(), 114 )<br/>12:10:30.500<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=591</link>
			<title><![CDATA[SQL中的18个常用函数]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Fri,20 Feb 2009 16:53:18 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=591</guid>
		<description><![CDATA[前些天在CSDN上看到linhan总结的，在此修改了几个不恰当之处和部分文字。<br/><br/>1：replace 函数<br/>第一个参数你的字符串，第二个参数你想替换的部分，第三个参数你要替换成什么<br/>sel&#101;ct replace(&#39;chxwei&#39;,&#39;w&#39;,&#39;vv&#39;)<br/>结果：chxvvei<br/><br/>2：substring函数<br/>第一个参数是字符串，第二个是开始截取位置，第三个截取长度<br/>sel&#101;ct substring(&#39;chxwei&#39;,1,3);<br/>结果：chx<br/><br/>3：charindex函数<br/>第一个参数你要查找的char，第二个参数你被查找的字符串 返回参数一在参数二的位置<br/>sel&#101;ct&nbsp;&nbsp;charindex(&#39;x&#39;,&#39;chxwei&#39;)<br/>结果：3<br/><br/>4：ASCII函数<br/>返回字符表达式中最左侧的字符的 ASCII 代码值。<br/>sel&#101;ct ASCII(&#39;chxwei&#39;)<br/>结果：99<br/><br/>5：nchar函数<br/>根据 Unicode 标准的定义，返回具有指定的整数代码的 Unicode 字符。<br/>参数是介于 0 与 65535 之间的正整数。如果指定了超出此范围的值，将返回 NULL。<br/>sel&#101;ct nchar(3213)<br/>结果：Unicode 字符（正方形）<br/><br/>6：soundex<br/>返回一个由四个字符组成的代码 (SOUNDEX)，用于评估两个字符串的相似性。代码的第一个字符是 character_e&#173;xpression 的第一个字符，代码的第二个字符到第四个字符是数字。<br/>Sel&#101;ct SOUNDEX (&#39;chxwei&#39;), SOUNDEX (&#39;liuwei&#39;)<br/>结果：C400 L500<br/><br/>7：char<br/>参数为介于 0 和 255 之间的整数。如果该整数表达式不在此范围内，将返回 NULL 值。<br/>Sel&#101;ct char(123)<br/>结果：{<br/><br/>8：str函数<br/>第一个参数必须为数字，第二个参数表示转化成char型占的位置，小于参数一位置返回*，大于右对齐<br/>Sel&#101;ct str(12345,3)<br/>结果：***<br/><br/>Sel&#101;ct str(12345,12)<br/>结果：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12345<br/><br/>9：difference函数<br/>返回一个整数值，指示两个字符表达式的 SOUNDEX 值之间的差异。<br/>返回的整数是 SOUNDEX 值中相同字符的个数。返回的值从 0 到 4 不等：0 表示几乎不同或完全不同，4 表示几乎相同或完全相同。<br/>Sel&#101;ct difference(&#39;chxwei&#39;,&#39;chxw&#39;)<br/>结果：4<br/><br/>10：stuff函数（四个参数）<br/>函数将字符串插入另一字符串。它在第一个字符串中从开始位置删除指定长度的字符；然后将第二个字符串插入第一个字符串的开始位置。<br/>Sel&#101;ct stuff(&#39;chxwei&#39;,2,3,&#39;chxwei&#39;)<br/>结果：cchxweiei<br/><br/>stuff的功能：删除指定长度的字符串并在指定的起始点插入另一组字符<br/>STUFF ( character_e&#173;xpression , start , length , character_e&#173;xpression ) <br/>character_e&#173;xpression ：操作的字符，<br/>start:删除和插入的起始点，<br/>length:删除的长度，<br/>character_e&#173;xpression ：要插入的字符<br/>===============================================================<br/><br/>11：left函数<br/>返回最左边N个字符，由参数决定<br/>sel&#101;ct left(&#39;chxwei&#39;,4)<br/>结果：chxw<br/><br/>12 right函数<br/>返回最右边N个字符，由参数决定<br/>sel&#101;ct right(&#39;chxwei&#39;,4)<br/>结果：xwei<br/><br/>13：replicate函数<br/>我的认为是把 “参数一” 复制 “参数二” 次<br/>sel&#101;ct replicate(&#39;chxwei&#39;,4)<br/>结果：chxweichxweichxweichxwei<br/><br/>14：len函数<br/>返回参数长度<br/>sel&#101;ct len(&#39;chxwei&#39;)<br/>结果：6<br/><br/>15：reverse函数<br/>反转字符串<br/>sel&#101;ct reverse(&#39;chxwei&#39;)<br/>结果：iewxhc<br/><br/>16：lower和upper函数<br/>参数大小写转化<br/>sel&#101;ct lower(upper(&#39;chxwei&#39;))<br/>结果：chxwei<br/><br/>17：ltrim和rtrim函数<br/>删除左边空格和右面空格<br/>sel&#101;ct ltrim(&#39;&nbsp;&nbsp;&nbsp;&nbsp;chxwei&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#39;)<br/>结果：chxwei&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>sel&#101;ct rtrim(&#39;&nbsp;&nbsp;&nbsp;&nbsp;chxwei&#39;)<br/>结果：&nbsp;&nbsp;&nbsp;&nbsp;chxwei<br/><br/>18： PATINDEX函数<br/>返回字符或者字符串在另一个字符串或者表达式中的起始位置，PATINDEX函数支持搜索字符串中使用通配符，这使PATINDEX函数对于变化的搜索字符串很有价值。第一参数之前和之后必须有 % 字符（搜索第一个或最后一个字符时除外）。<br/>sel&#101;ct patindex(&#39;%xw%&#39;,&#39;chxwei&#39;)<br/>结果：3<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=590</link>
			<title><![CDATA[SQL数据库系统表 说明]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Mon,16 Feb 2009 12:31:25 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=590</guid>
		<description><![CDATA[<br/>master数据库记录SQL Server系统的所有系统级别信息，是最重要的系统库。 <br/>记录了SQL Server系统的所有系统信息。包括所有的登录信息、系统设置信息、SQL Server的初始化信息和其它系统数据库及用户数据库的相关信息。 <br/><br/>tempdb是一个临时数据库，保存所有的临时表和临时存储过程，以及其他的临时存储空间的要求。Tempdb数据库由整个系统的所有数据库使用。SQL Server每次启动时，tempdb数据库被重新建立。当用户与SQL Server断开连接时，其临时表和存储过程被自动删除。 <br/><br/><br/>model数据库是为用户创建数据库提供的模板。 <br/><br/>msdb数据库供SQL Server代理程序调度警报和作业以及记录各种操作。 <br/><br/>northwind和pubs是实例数据库。 <br/><br/>northwind 和 pubs 是可以删除的 其他四个master最为重要不能删。]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=541</link>
			<title><![CDATA[SQL Server数据库开发的21条注意事项]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Fri,28 Nov 2008 12:34:44 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=541</guid>
		<description><![CDATA[转自CSDN<br/><br/>如果你正在负责一个基于SQL Server的项目，或者你刚刚接触SQL Server，你都有可能要面临一些数据库性能的问题，这篇文章会为你提供一些有用的指导（其中大多数也可以用于其它的DBMS）。 <br/>在这里，我不打算介绍使用SQL Server的窍门，也不能提供一个包治百病的方案，我所做的是总结一些经验----关于如何形成一个好的设计。这些经验来自我过去几年中经受的教训，一直来，我看到许多同样的设计错误被一次又一次的重复。<br/> <br/>一、<strong>了解你用的工具</strong> <br/>不要轻视这一点，这是我在这篇文章中讲述的最关键的一条。也许你也看到有很多的SQL Server程序员没有掌握全部的T-SQL命令和SQL Server提供的那些有用的工具。 <br/>“什么？我要浪费一个月的时间来学习那些我永远也不会用到的SQL命令？？？”，你也许会这样说。对的，你不需要这样做。但是你应该用一个周末浏览所有的T-SQL命令。在这里，你的任务是了解，将来，当你设计一个查询时，你会记起来：“对了，这里有一个命令可以完全实现我需要的功能”，于是，到MSDN查看这个命令的确切语法。<br/> <br/>二、<strong>不要使用游标</strong> <br/>让我再重复一遍：不要使用游标。如果你想破坏整个系统的性能的话，它们倒是你最有效的首选办法。大多数的初学者都使用游标，而没有意识到它们对性能造成的影响。它们占用内存，还用它们那些不可思议的方式锁定表，另外，它们简直就像蜗牛。而最糟糕的是，它们可以使你的DBA所能做的一切性能优化等于没做。不知你是否知道每执行一次FETCH就等于执行一次Sel&#101;ct命令？这意味着如果你的游标有10000条记录，它将执行10000次Sel&#101;ct！如果你使用一组Sel&#101;ct、Up&#100;ate或者Del&#101;te来完成相应的工作，那将有效率的多。 <br/>初学者一般认为使用游标是一种比较熟悉和舒适的编程方式，可很不幸，这会导致糟糕的性能。显然，SQL的总体目的是你要实现什么，而不是怎样实现。 <br/>我曾经用T-SQL重写了一个基于游标的存储过程，那个表只有100,000条记录，原来的存储过程用了40分钟才执行完毕，而新的存储过程只用了10秒钟。在这里，我想你应该可以看到一个不称职的程序员究竟在干了什么！！！ <br/>我们可以写一个小程序来取得和处理数据并且更新数据库，这样做有时会更有效。记住：对于循环，T-SQL无能为力。 <br/>我再重新提醒一下：使用游标没有好处。除了DBA的工作外，我从来没有看到过使用游标可以有效的完成任何工作。 <br/><br/>三、<strong>规范化你的数据表</strong> <br/>为什么不规范化数据库？大概有两个借口：出于性能的考虑和纯粹因为懒惰。至于第二点，你迟早得为此付出代价。而关于性能的问题，你不需要优化根本就不慢的东西。我经常看到一些程序员“反规范化”数据库，他们的理由是“原来的设计太慢了”，可结果却常常是他们让系统更慢了。DBMS被设计用来处理规范数据库的，因此，记住：按照规范化的要求设计数据库。<br/> <br/>四、<strong>不要使用Sel&#101;ct *</strong> <br/>这点不太容易做到，我太了解了，因为我自己就经常这样干。可是，如果在Sel&#101;ct中指定你所需要的列，那将会带来以下的好处： <br/>1 减少内存耗费和网络的带宽 <br/>2 你可以得到更安全的设计 <br/>3 给查询优化器机会从索引读取所有需要的列 <br/><br/>五、<strong>了解你将要对数据进行的操作</strong> <br/>为你的数据库创建一个健壮的索引，那可是功德一件。可要做到这一点简直就是一门艺术。每当你为一个表添加一个索引，Sel&#101;ct会更快了，可Ins&#101;rt和Del&#101;te却大大的变慢了，因为创建了维护索引需要许多额外的工作。显然，这里问题的关键是：你要对这张表进行什么样的操作。这个问题不太好把握，特别是涉及Del&#101;te和Up&#100;ate时，因为这些语句经常在Wh&#101;re部分包含Sel&#101;ct命令。<br/> <br/>六、<strong>不要给“性别”列创建索引</strong> <br/>首先，我们必须了解索引是如何加速对表的访问的。你可以将索引理解为基于一定的标准上对表进行划分的一种方式。如果你给类似于“性别”这样的列创建了一个索引，你仅仅是将表划分为两部分：男和女。你在处理一个有1,000,000条记录的表，这样的划分有什么意义？记住：维护索引是比较费时的。当你设计索引时，请遵循这样的规则：根据列可能包含不同内容的数目从多到少排列，比如：姓名+省份+性别。<br/> <br/>七、<strong>使用事务</strong> <br/>请使用事务，特别是当查询比较耗时。如果系统出现问题，这样做会救你一命的。一般有些经验的程序员都有体会-----你经常会碰到一些不可预料的情况会导致存储过程崩溃。<br/> <br/>八、<strong>小心死锁</strong> <br/>按照一定的次序来访问你的表。如果你先锁住表A，再锁住表B，那么在所有的存储过程中都要按照这个顺序来锁定它们。如果你（不经意的）某个存储过程中先锁定表B，再锁定表A，这可能就会导致一个死锁。如果锁定顺序没有被预先详细的设计好，死锁是不太容易被发现的。 <br/><br/>九、<strong>不要打开大的数据集</strong> <br/>一个经常被提出的问题是：我怎样才能迅速的将100000条记录添加到ComboBox中？这是不对的，你不能也不需要这样做。很简单，你的用户要浏览100000条记录才能找到需要的记录，他一定会诅咒你的。在这里，你需要的是一个更好的UI，你需要为你的用户显示不超过100或200条记录。<br/> <br/>十、<strong>不要使用服务器端游标</strong> <br/>与服务器端游标比起来，客户端游标可以减少服务器和网络的系统开销，并且还减少锁定时间。<br/> <br/>十一、<strong>使用参数查询</strong> <br/>有时，我在CSDN技术论坛看到类似这样的问题：“Sel&#101;ct * FROM a Wh&#101;re a.id=&#39;A&#39;B，因为单引号查询发生异常，我该怎么办？”，而普遍的回答是：用两个单引号代替单引号。这是错误的。这样治标不治本，因为你还会在其他一些字符上遇到这样的问题，更何况这样会导致严重的bug，除此以外，这样做还会使SQL Server的缓冲系统无法发挥应有的作用。使用参数查询， 釜底抽薪，这些问题统统不存在了。<br/> <br/>十二、<strong>在程序编码时使用大数据量的数据库</strong> <br/>程序员在开发中使用的测试数据库一般数据量都不大，可经常的是最终用户的数据量都很大。我们通常的做法是不对的，原因很简单：现在硬盘不是很贵，可为什么性能问题却要等到已经无可挽回的时候才被注意呢？<br/> <br/>十三、<strong>不要使用Ins&#101;rt导入大批的数据</strong> <br/>请不要这样做，除非那是必须的。使用UTS或者BCP，这样你可以一举而兼得灵活性和速度。<br/> <br/>十四、<strong>注意超时问题</strong> <br/>查询数据库时，一般数据库的缺省都比较小，比如15秒或者30秒。而有些查询运行时间要比这长，特别是当数据库的数据量不断变大时。<br/> <br/>十五、<strong>不要忽略同时修改同一记录的问题</strong> <br/>有时候，两个用户会同时修改同一记录，这样，后一个修改者修改了前一个修改者的操作，某些更新就会丢失。处理这种情况不是很难：创建一个timestamp字段，在写入前检查它，如果允许，就合并修改，如果存在冲突，提示用户。 <br/><br/>十六、<strong>在细节表中插入纪录时，不要在主表执行Sel&#101;ct MAX(ID)</strong> <br/>这是一个普遍的错误，当两个用户在同一时间插入数据时，这会导致错误。你可以使用SCOPE_IDENTITY，IDENT_CURRENT和IDENTITY。如果可能，不要使用IDENTITY，因为在有触发器的情况下，它会引起一些问题（详见这里的讨论）。<br/> <br/>十七、<strong>避免将列设为NULLable</strong> <br/>如果可能的话，你应该避免将列设为NULLable。系统会为NULLable列的每一行分配一个额外的字节，查询时会带来更多的系统开销。另外，将列设为NULLable使编码变得复杂，因为每一次访问这些列时都必须先进行检查。 <br/>我并不是说NULLS是麻烦的根源，尽管有些人这样认为。我认为如果你的业务规则中允许“空数据”，那么，将列设为NULLable有时会发挥很好的作用，但是，如果在类似下面的情况中使用NULLable，那简直就是自讨苦吃。 <br/>CustomerName1 <br/>CustomerAddress1 <br/>CustomerEmail1 <br/>CustomerName2 <br/>CustomerAddress2 <br/>CustomerEmail3 <br/>CustomerName1 <br/>CustomerAddress2 <br/>CustomerEmail3 <br/>如果出现这种情况，你需要规范化你的表了。<br/> <br/>十八、<strong>尽量不要使用TEXT数据类型</strong> <br/>除非你使用TEXT处理一个很大的数据，否则不要使用它。因为它不易于查询，速度慢，用的不好还会浪费大量的空间。一般的，VARCHAR可以更好的处理你的数据。 <br/><br/>十九、<strong>尽量不要使用临时表</strong> <br/>尽量不要使用临时表，除非你必须这样做。一般使用子查询可以代替临时表。使用临时表会带来系统开销，如果你是用COM+进行编程，它还会给你带来很大的麻烦，因为COM+使用数据库连接池而临时表却自始至终都存在。SQL Server提供了一些替代方案，比如Table数据类型。<br/> <br/>二十、<strong>学会分析查询</strong> <br/>SQL Server查询分析器是你的好伙伴，通过它你可以了解查询和索引是如何影响性能的。<br/> <br/>二十一、<strong>使用参照完整性</strong> <br/>定义主健、唯一性约束和外键，这样做可以节约大量的时间。]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=515</link>
			<title><![CDATA[SQL Server2000在XP下安装提示“安装程序配置服务器失败”的解决办法]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Wed,05 Nov 2008 12:27:38 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=515</guid>
		<description><![CDATA[昨天晚上安装了SQL Server 2000和PowerBuilder9.0，在安装SQL快要结束的的时候竟然提示“安装程序配置服务器失败”，用了5年多了还没有遇到过这种事。<br/>删除安装目录和注册表里的关于SQL Server的信息，重新安装还是依旧，查看安装日志也看不出什么来。<br/>没办法，在Google上搜索了一下，发现很多解决办法，不过能不能解决还不知道。<br/>1、删除安装目录和注册表里的相关信息，这个已经试过了，不行。<br/>2、按下面步骤安装是没有问题的： 首先安装MSDE文件夹下的Setup（之后手工重起）；再启动根目录下安装程序（安装过程中要勾掉帮助项）。不行，第一步就安装不了。<br/>3、安装文件有问题。我用的是从网上下的4合1，安装的是开发版，在公司都可以安装，所以应该问题。<br/>4、安装文件不要放在中文目录下。没测试。<br/>5、计算机名称必须为大写。感觉这条有点滑稽，我看了一下电脑名称确实是小写，不妨改一下试试，于是就改成了另外一个大写的字母组合，重新启动之后再安装SQL，没想到竟然<span style="color:Blue">安装成功</span>了！有点可笑。<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=328</link>
			<title><![CDATA[数据库挂马技术的实现与解决方法]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Thu,12 Jun 2008 12:53:46 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=328</guid>
		<description><![CDATA[这几天公司一网站的数据库中的数据被批量修改了，挂马，由于网站是以前别人做的，从ftp下来看了看，反正代码很乱，有用的无用的，那么一大堆。<br/>最近这种挂马很流行，只是针对asp＋Sql Server的网站，只有你代码存在小小的漏洞，就会被挂马，而且只针对文本型的字段char/text类似的字段，修改之后的数据后面基本上都是js，1.js，b.js等。而且里面的网址经常改变。<br/>搜索一下，发现以下脚本：<br/>SQL语句如下：<br/><br/>用游标遍历所有表里如下数据类型的字段，然后Up&#100;ate挂马。（全部是允许写入字符的字段）<br/><br/>xtype=99 ntext<br/>xtype=35 text<br/>xtype=231 nvarchar <br/>xtype=167 varchar<br/>———————-分割线——————————–<br/>DECLARE @T varchar(255),<br/>@C varchar(255)<br/>DECLARE Table_Cursor CURSOR FOR<br/>Sel&#101;ct<br/>a.name,b.name<br/>from sysobjects a,<br/>syscolumns b<br/>wh&#101;re a.id=b.id and<br/>a.xtype=’u’ and<br/>(b.xtype=99 o&#114; b.xtype=35 o&#114; b.xtype=231 o&#114; b.xtype=167)<br/>OPEN Table_Cursor<br/>FETCH NEXT FROM Table_Cursor INTO @T,@C<br/>WHILE(@@FETCH_STATUS=0)<br/>BEGIN<br/>exec(’up&#100;ate [’+@T+’] set [’+@C+’]=<br/>rtrim(convert(varchar,[’+@C+’]))+<br/>”挂马内容”’)<br/>FETCH NEXT FROM Table_Cursor INTO @T,@C<br/>END<br/>CLOSE Table_Cursor<br/>DEALLOCATE Table_Cursor <br/><br/>－－－－－－－－－－－－－－－－－－－－－－－<br/>没有测试，先放上来。<br/><br/>解决方法：<br/>出现这种挂马只能说是你的代码有些许漏洞，只能规范代码，把每个接收参数的地方都做好防范。这句话等于不说，但是也只能这样。<br/>或者在读取数据的时候把&lt;script&gt;&lt;/script&gt;之间的使用正则全部替换，但是不是长久办法。<br/><br/><span style="color:Red">最新解决方法：</span><br/>在连接数据库的Conn.asp文件中加入“<a target="_blank" href="http://www.chxwei.com/article.asp?id=341" rel="external">防止SQL注入的ASP代码</a>”。]]></description>
		</item>
		
			<item>
			<link>http://www.chxwei.com/article.asp?id=316</link>
			<title><![CDATA[sql中的随机函数newID()和RAND()]]></title>
			<author>admin@yahoo.cn(chxwei)</author>
			<category><![CDATA[数据库]]></category>
			<pubDate>Sun,01 Jun 2008 10:07:49 +0800</pubDate>
			<guid>http://www.chxwei.com/default.asp?id=316</guid>
		<description><![CDATA[　　sql server的随机函数newID()和RAND()　　 <br/><br/>　　Sel&#101;ct * FROM Northwind..Orders o&#114;DER BY NEWID() ------随机排序 <br/><br/>　　Sel&#101;ct TOP 10 * FROM Northwind..Orders o&#114;DER BY NEWID() ------从Orders表中随机取出10条记录　　 <br/><br/>　　示例　　 <br/><br/>　　A、对变量使用 NEWID 函数 <br/><br/>　　以下示例使用 NEWID() 对声明为 uniqueidentifier 数据类型的变量赋值。在测试 uniqueidentifier 数据类型变量的值之前，先输出该值。 <br/><br/>　　-- Creating a local variable with DECLARESET syntax. <br/><br/>　　DECLARE @myid uniqueidentifier <br/><br/>　　SET @myid = NEWID() <br/><br/>　　PRINT &#39;Value of @myid is &#39;+ CONVERT(varchar(255), @myid) <br/><br/>　　下面是结果集： <br/><br/>　　Value of @myid is 6F9619FF-8B86-D011-B42D-00C04FC964FF <br/><br/>　　注意： <br/><br/>　　NEWID 对每台计算机返回的值各不相同。所显示的数字仅起解释说明的作用。　　 <br/><br/>　　随机函数：rand() <br/><br/>　　在查询分析器中执行：sel&#101;ct rand()，可以看到结果会是类似于这样的随机小数：0.36361513486289558，像这样的小数在实际应用中用得不多，一般要取随机数都会取随机整数。那就看下面的两种随机取整数的方法： 　　 <br/><br/>　　1、 <br/><br/>　　A：sel&#101;ct floor(rand()*N) ---生成的数是这样的：12.0 <br/><br/>　　B：sel&#101;ct cast( floor(rand()*N) as int) ---生成的数是这样的：12 　　 <br/><br/>　　2、 <br/><br/>　　A：sel&#101;ct ceiling(rand() * N) ---生成的数是这样的：12.0 <br/><br/>　　B：sel&#101;ct cast(ceiling(rand() * N) as int) ---生成的数是这样的：12 　　 <br/><br/>　　其中里面的N是一个你指定的整数，如100，可以看出，两种方法的A方法是带有.0这个的小数的，而B方法就是真正的整数了。 <br/><br/>大致一看，这两种方法没什么区别，真的没区别？其实是有一点的，那就是他们的生成随机数的范围： <br/><br/>　　方法1的数字范围：0至N-1之间，如cast( floor(rand()*100) as int)就会生成0至99之间任一整数 <br/><br/>　　方法2的数字范围：1至N之间，如cast(ceiling(rand() * 100) as int)就会生成1至100之间任一整数 <br/><br/>　　对于这个区别，看SQL的联机帮助就知了：　　 <br/><br/>　　比较 CEILING 和 FLOOR <br/><br/>　　CEILING 函数返回大于或等于所给数字表达式的最小整数。FLOOR 函数返回小于或等于所给数字表达式的最大整数。例如，对于数字表达式 12.9273，CEILING 将返回 13，FLOOR 将返回 12。FLOOR 和 CEILING 返回值的数据类型都与输入的数字表达式的数据类型相同。 <br/><br/>　　现在，各位就可以根据自己需要使用这两种方法来取得随机数了^_^ 　　 <br/><br/>　　另外，还要提示一下各位菜鸟，关于随机取得表中任意N条记录的方法，很简单，就用newid()： <br/><br/>　　sel&#101;ct top N * from table_name o&#114;der by newid() ----N是一个你指定的整数，表是取得记录的条数. ]]></description>
		</item>
		
</channel>
</rss>
