<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<lastBuildDate>Sat, 08 Mar 2008 20:18:14 +0800</lastBuildDate>
<title>SQLServer - czBin's Blog</title>
<link>http://www.czBin.cn/SQLServer.xml</link>
<description>czBin.cn -> SQLServer的技术文章</description>
<item>
<pubDate>Sat, 08 Mar 2008 20:18:14 +0800</pubDate>
<title>让您的SQLSERVER自动进行某项动作——“作业与调度”</title>
<link>http://www.czBin.cn/SQL.Work.php</link>
<description><![CDATA[近期为某客户制作一个WEB系统时遇到一个问题，客户希望某个表中的数据在每天的00：00：01时刻自动恢复到初始状态，再利用本WEB程序重新进行操作。想来想去，这个功能都不能利用WEB程序来完成，当然我也可以让本WEB程序在当天第一次运行时来完成这个工作，但这样并不能达到真正自动完成的设想。所以，我采用了作业这个SQL自带的机制。<br />
要添加一个作业首先要以SA权限或者windows权限登陆，并且开启sql server agent服务。<br />
具体操作步骤如下&quot;<br />
1、打开sql server 服务管理器，选择sql server agent，并将“当OS运行时启动服务”选择上。然后点开始按钮启动该服务。<br />
   有的时候，会出现错误。可以尝试以下解决办法：控制面板——管理工具——SQLSERVERAGENT——属性——登陆——选择“本地系统帐户”（或填写正确帐号信息）——确认。<br />
2、添加作业：企业管理器——管理——SQL SERVER 代理——作业——右键——新建作业（按提示操作）——步骤——新建（按提示操作）——调度——新建调度，假如需要设置该作业每天执行，则选择“反复出现”，并点击更改，对调度的执行时间等进行设置。<br />
<br />
本问中只介绍“企业管理器”中的傻瓜操作，假如想以脚本生成其实很简单。只需要按本文介绍的方法建立作业后，再利用企业管理器生成SQL脚本即可。具体操作步骤为：<br />
企业管理器——管理——SQL SERVER 代理——作业——选择作业——右键——所有任务——生成SQL脚本<br />
   <br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQL.Work.php</guid>   
</item>
<item>
<pubDate>Sat, 08 Mar 2008 19:59:04 +0800</pubDate>
<title>SQLSERVER下简易安全防范</title>
<link>http://www.czBin.cn/SQL.xp_cmdshell.php</link>
<description><![CDATA[当今，溢出攻击已经渐渐淡出黑客界（除非你是非常高手之高手）。慢慢的，脚本攻击成为了主流入侵手段。对于我们这些做WEB的程序员来说，这无疑是一大挑战。<br />
脚本攻击的方式很多，其中最为广泛的就是SQL注入攻击，假如你的WEB程序使用的后台数据库是ACCESS，那么当黑客入侵你的网站的时候或许你还能逃过一劫。因为诸如ACCESS纯粹靠暴力猜测数据库中的表、字段和数据。而假如你使用的是SQLSERVER数据库，那么恐怕你的网站就危险多了，而假如你使用的是sa登陆的话恐怕连你的主机都要陷落。<br />
防范手段：<br />
1、仔细检查WEB程序后台代码，对所有提交数据库的数据进行过滤，这不只包括GET得到的字符串，还包括用户名、密码等通过表单提交的数据。<br />
2、删除xp_cmdshell扩展存储过程，在查询分析器中执行SQL命令：<br />
sp_dropextendedproc   xp_cmdshell 删除（sp_addextendedproc   xp_cmdshell,'xplog70.dll'  恢复）<br />
3、尽量不要使用sa作为网站与数据库连接的用户。<br />
先简单写这些吧，毕竟是“简易安全防范么”。以后想到了我会再补上的。<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQL.xp_cmdshell.php</guid>   
</item>
<item>
<pubDate>Thu, 13 Dec 2007 02:56:11 +0800</pubDate>
<title>SQL按月份查询日期类型</title>
<link>http://www.czBin.cn/SQL.DATETIME.MONTH.php</link>
<description><![CDATA[最近日期查询的问题确实遇到的比较多，这个问题主要是这样的，<br />
某表TABLE中的数据格式如下：<br />
姓名，开始日期，截止日期，岗位，考勤。<br />
其中开始日期和截止日期为datetime类型，而现在要查询2007年7月所有的考勤。并且开始日期和截止日期不一定是从月头到月末。也就是说一个月可能换几次岗位。那么该如何实现呢？<br />
我的方法是这样的：<br />
SELECT * FROM TABLE <br />
WHERE 2007*12+7 <br />
BETWEEN <br />
(YEAR(开始日期)*12+MONTH(开始日期)) <br />
AND<br />
(YEAR(截止日期)*12+MONTH(截止日期)) <br />
--一年等于12个月，将所有的日期的年部分与月部分全部转换为月的数目，按照月的数目进行查询<br />
<br />
注：<br />
一开始我的查询条件是直接将开始日期和截止日期的年月部分转换成字符串比较，但是那样出现了逻辑错误，<br />
例如：<br />
'2007-6'&lt;'2007-12' ，而实际上'2007-6'&gt;'2007-12',这与字符串比较的方法有关，这里不深入讨论了，总之这样是不行的！！！<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQL.DATETIME.MONTH.php</guid>   
</item>
<item>
<pubDate>Thu, 13 Dec 2007 02:37:29 +0800</pubDate>
<title>SQL日期查询之另类求交集</title>
<link>http://www.czBin.cn/SQL.DATETIME.BJ.php</link>
<description><![CDATA[最近忙着做报表,所以遇到SQL的日期查询比较多,出现的问题也比较多,这里写出我的一些解决方法,也许有不到之处,高手莫笑.大家互相学习么!<br />
下面我要讲的一个问题来源于一个人员动态系统的动态汇总模块,首先看表的结构:<br />
关键字段为:<br />
姓名,开始日期,截止日期,动态<br />
表名P_D。<br />
用户要求查询与2007-1-1到2007-12-1又交叉的所有日期范围（开始日期到截止日期）。<br />
首先分析有交叉的可能性，当然截止日期必定大于开始日期：<br />
1、开始日期&lt;=2007-1-1；截止日期&gt;=2007-12-1<br />
2、开始日期&gt;=2007-1-1；截止日期&lt;=2007-12-1<br />
3、开始日期&lt;=2007-1-1；2007-1-1&lt;=截止日期&lt;=2007-12-1<br />
4、2007-1-1&lt;=开始日期&lt;=2007-12-1；截止日期&gt;=2007-12-1<br />
<br />
那么排除了这些之外的所有可能性就是不交叉，换句话说只要排除了不交叉就是交叉。<br />
有那些情况是不交叉呢？如下：<br />
1、开始日期&lt;2007-1-1；截止日期&lt;2007-1-1<br />
2、开始日期&gt;2007-12-1；截止日期&gt;2007-12-1<br />
<br />
分析完以上逻辑关系我们就可以构造SQL语句了，很明显，如果使用交叉的逻辑关系那么SQL语句就会比较麻烦，所以我们使用相反的逻辑关系。<br />
SQL语句如下：<br />
SELECT * FROM P_D <br />
WHERE NOT   --注意加括号<br />
(<br />
(开始日期&lt;'2007-1-1' AND 截止日期&lt;'2007-1-1')  --注意加括号<br />
 OR<br />
(开始日期&gt;'2007-2-1' AND 截止日期&gt;'2007-2-1') --注意加括号<br />
) <br />
<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQL.DATETIME.BJ.php</guid>   
</item>
<item>
<pubDate>Wed, 31 Oct 2007 11:45:53 +0800</pubDate>
<title>SQL中IN与EXISTS的用法比较</title>
<link>http://www.czBin.cn/SQLSERVER.IN.EXISTS.001.php</link>
<description><![CDATA[作为子查询:<br />
IN：<br />
1、SELECT * FROM family WHERE id IN  (SELECT [id]  FROM p_info)<br />
返回结果为所有id包含在p_info表中的Paples_Info结果集.<br />
EXISTS：<br />
2、SELECT * FROM family WHERE EXISTS (SELECT [id]  FROM p_info)<br />
返回结果为p_info存在相同数据的family结果集.（并不指定哪列相同）<br />
3、SELECT * FROM family WHERE EXISTS (SELECT [id]  FROM p_info WHERE family.[id]=P_INFO.[id])<br />
返回结果同（1），这是指定了id列关联的结果。<br />
作为主查询条件<br />
IN ：<br />
SELECT * FROM family WHERE id IN('12345','56789')<br />
EXISTS：<br />
无<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQLSERVER.IN.EXISTS.001.php</guid>   
</item>
<item>
<pubDate>Sat, 20 Oct 2007 22:38:13 +0800</pubDate>
<title>解决SQL Server2000不能启动问题.</title>
<link>http://www.czBin.cn/SQLSERVER.Start.Error.001.php</link>
<description><![CDATA[昨天一个使用我写的数据库软件的客户打电话过来说软件不能使用了,<br />
由于那个客户电脑方面比较....具体原因也说不清楚,只说软件启动不了,<br />
我的软件经过多次测试,自己认为不会出现这种问题,所以直觉告诉<br />
我是SQL出问题了,立刻过去现场看看,果然是这个问题。<br />
这个机子是我前天才帮他们装的SQL和软件，我就怀疑是不是每次一重起计算机<br />
SQL就不能启动，所以我又将SQL重装一遍，果然如此.<br />
找问题中。。。。郁闷中。。。。折腾了有半个小时，突然，又是直觉告诉<br />
我是不是系统服务出了问题，打开服务管理器，果然，很多服务都被禁用了，<br />
原来买电脑的时候给这个电脑做系统的人把很多服务禁用了，而他们把用这个<br />
电脑的人当成只是上网聊天的普通用户了。于是，打开这些服务，重新启动计算机<br />
果然，SQL再也没出现先前的问题了。<br />
如果你的SQL也出现安装完系统就不能启动这样的问题可以按照我说的方法试试，<br />
把禁用的一些服务打开，或许问题就解决了。。。<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQLSERVER.Start.Error.001.php</guid>   
</item>
<item>
<pubDate>Sat, 23 Jun 2007 17:04:49 +0800</pubDate>
<title>SQLSERVER在企业管理器中设置DateTime默认值为当前时间</title>
<link>http://www.czBin.cn/SQLSERVER.DateTime.php</link>
<description><![CDATA[在企业管理器的DateTime字段默认值的位置输入：(getdate())就可以了<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQLSERVER.DateTime.php</guid>   
</item>
<item>
<pubDate>Sun, 10 Jun 2007 17:04:54 +0800</pubDate>
<title>SQL Insert into数据后立刻返回主键Id</title>
<link>http://www.czBin.cn/SQL.insert.001.php</link>
<description><![CDATA[很多时候，我们在向数据库插入（insert into）一条数据以后，需要立即得到此条数据的主键ID<br />
<br />
当然，我们可以立刻SELECT一次，在大部分情况下，&quot;ORDER BY 主键 DESC&quot;就可以返回相应数据。但这样做，有可能返回的并不是我们刚刚插入的数据。<br />
<br />
所以，我们可以使用下面的方法。<br />
<br />
以asp为例，其他语言一样用：<br />
<br />
&lt;%<br />
My_Insert_into = &quot;111&quot;<br />
sql1=&quot;insert into [TABLE] (KEY) values ('&quot;&amp;My_Insert_into&amp;&quot;')&quot;<br />
sql2=&quot;select @@identity as aa&quot;<br />
set rs = server.CreateObject(&quot;adodb.recordset&quot;)<br />
conn.Execute(sql1)<br />
rs.open sql2,conn,1,3<br />
response.Write(rs(&quot;aa&quot;)) <br />
%&gt;<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQL.insert.001.php</guid>   
</item>
<item>
<pubDate>Sat, 09 Jun 2007 22:51:06 +0800</pubDate>
<title>将numeric转换为数据类型numeric时发生算术溢出错误</title>
<link>http://www.czBin.cn/SQLServer.numeric.php</link>
<description><![CDATA[今天做SQLSERVER,读取数据时,出现这个错误:<br />
<br />
&quot;将numeric转换为数据类型numeric时发生算术溢出错误&quot;<br />
<br />
上网搜了一下,也没找到什么具体的解决办法<br />
<br />
最后自己研究,发现是某个存储大数值的字段产生的该错误<br />
<br />
最后,把该字段改为float型,解决<br />
<br />
如果你也一样遇到了该错误,可以考虑按照以下的方法试一试:<br />
<br />
1:看看自己的表中是否有一个字段存储着大数值之类的数据(如258745874521547这种)<br />
<br />
2:把该字段改为float型<br />
<br />
......<br /><br /><br />]]></description>
<category>SQLServer</category> 
<guid isPermaLink="true">http://www.czBin.cn/SQLServer.numeric.php</guid>   
</item>
</channel>
</rss>