2006年11月22日

      新的系统已经上马测试,这个时候涉及到的数据库的问题就是数据的导入导出。昨天遇到了这样一个问题,如何从一个机器上将一个表的数据直接插入到另外一台机器的一个表中。所以这里就涉及到了如何跨机器的查询数据的问题了。经过和同事的探讨和资料的查询,后来发现有如下的sql语句能实现如下功能。可见sql server还是预见了使用者的很多的需求,同时也可见我对数据库的了解现在也只是九牛一毛。^_^

  先贴出此sql语句再继续侃吧。

      select * from OPENDATASOURCE(‘SQLOLEDB’,'Data Source=SERVER;User ID=sa;Password=sa’).master.dbo.Base_Pro

  其中 ,OPENDATASOURCE这个才是关键。这样就能从一台机器上(通过局域网能连接上的机器)直接获得一个表的数据了。

   假如在广域网上,知道某台机器的ip,还有数据库的密码是否也是同样能获得这个数据呢?还有待试验!有了结果再来!

2006年08月22日

       7月份关于系统,做了一个新的功能。完成了新的功能后,我要对操作人员做大面积的培训。我曾经录制了视频还有编写了使用文档,给所以的人员都发送了消息。结果使用的效果并不如意。或许间接的也说明了我的培训工作做得很不到位。国内的培训工作做的如此,何况海外的培训工作呢?更是没有做到。我想中间我犯了这样的错误:

    1 针对培训工作跟进不到位,没有及时的把握新功能的使用效果,针对使用效果不能令人满意的局面没有及时的了解到,然后采取新的措施。

    2 在发送完通知后,应该督促国内的人员,海外的负责人员注意查收。

    3 培训的视频录制的是中文界面的操作,而忽略了海外的使用的英文版本的操作界面。并且说明文档也只是中文的说明文档,没有英文的说明文档。

   4 没有及时的查看项目一期的数据,从数据中找出问题进行查找解决的办法。

    无论自己做的功能是好是坏,我想每个人都想维护自己的东西。因为它毕竟是自己的工作成果。但是最初始于的应该是对这个功能的一份热情。应该要相信自己的功能是好的。然后在这种热情的驱使下,去继续的完善,改进自己的程序,使新的功能更能适用,更能得到最大的推广。

    心情很不爽!

   自己的工作能力上需要进一步的提高,编程能力也有待于提高。

   今天一天的心情就这样没了!哎 下雨了! 

2006年06月27日

     现在假如有一部分数据,但是只是获得其中的一部分数据,这个的一部分如何获得呢?例如现在获得其中的一半,如何查询?

   经常我们的写法是select top  100 但是假如并不知道这个的一半是多少数据的时候,就不能这样写了。

   后来参考到在查找试图的时候,曾经使用到percent这个关键词。后来查找资料,发现原来是可以使用这个关键词来查找数据的。

  select top 50 percent * from tablename

  这样就能查找到了自己想要的那部分的数据了。

  在数据库中,text类型字段经常是一个比较特殊的类型,sql server进行处理这种类型的数据的时候,都是有专门的函数。如在查询数据时候需要判断某个text类型不为空的时候,因为text类型的数据只能使用is null和like 来进行模糊查询。最后,经过查找帮助,发现有另外的一个函数是获得表达式的字节数。在sql的联机丛书中是这样介绍这个函数的。

   DATALENGTH
返回任何表达式所占用的字节数。

语法
DATALENGTH ( expression )

参数
expression

任何类型的表达式。

返回类型
int

注释
DATALENGTH 对 varchar、varbinary、text、image、nvarchar 和 ntext 数据类型特别有用,因为这些数据类型可以存储可变长度数据。

NULL 的 DATALENGTH 的结果是 NULL。

所以,在判断的时候,我们就可以这样来书写sql语句了

  select  * from Ship_CustomerMTL where (DATALENGTH(str_Kehubz)=0 or DATALENGTH(str_Kehubz) is null)

  就是判断该字段的字节数为0或者是null就可以了。

 

2006年05月29日

 昨天开始,重新回到了工作岗位,开始了工作。不知道具体的五一,十一黄金周国家的政策是从哪一年开始实施的,或许在我正在埋头苦读,正在冲向大学的路上坎坷的走着的时候,就已经存在了吧!只是那个时候除了高考,已经忘记了假日,玩耍,春游各种各样想想都让人心神荡漾的美好的事情了!幸好现在的公司还有点人情味,没有剥夺这样美好的节日。所以还是蛮开心的!

    难得有这样的一个假期,但是有很多的事情,所以七天是每天都有安排,每天都有计划。不过,感觉过得也是很开心的。因为这种节日出去旅游,也很累的,起早贪黑的;然后没有安排的,啥都不干的其实也过得呢挺累的,刚好象我,有点事情,但是呢也不算太重的事情啊,每天都能享受懒觉的美好,并且每天呢还过得呢挺充实的也不错了!

   昨天刚一上班,上司就给我开会,敲警钟啊,接下来大家要集中精神,努力工作,接下来的工作很繁重,时间很紧张等等,上班之前已经想到拉!毫不意外啊,也已经做好了准备了啊!

   昨天要针对遗留下来的问题做一个了断,要开始了新的工作了。上午和同时开会碰头将情况也了解了,也定了方案了,算是对于问题已经有了确切的解决方案了。但是下午老总过来开会又谈到了同样的问题,结果老总的意见又是另外的一番想法,完全不同的,所以啊,整个的意见的完全相反!头晕啊!回头理了理头绪,算是整理完了。明天一大早提交给上司,有个了断吧!

   今天下午同时告诉我,出现了故障,我很早以前完成的一个功能。刚开始做软件的时候,一有故障,我就很紧张。现在已经能平静对待了,作为软件,故障是正常的啊,微软的还有bug呢!以平常心来面对工作,呵呵是进步呢?!

–月初   本月一号
set @BeginDate = convert(varchar(8),datepart(year,@WhichMonth))+’-'+convert(varchar(8),datepart(m,@WhichMonth))+’-1′
–月末 下月一号减一天
set @EndDate = dateadd(day,-1,convert(varchar(8),datepart(year,dateadd(m,1,@WhichMonth)))+’-'+convert(varchar(8),datepart(m,dateadd(m,1,@WhichMonth)))+’-1 23:59:59′)

简化
set @BeginDate = convert(varchar(8),@WhichMonth,120)+’1′

set @EndDate = dateadd(day,-1,convert(varchar(8),dateadd(m,1,@WhichMonth),120)+’1 23:59:59′)

 

经过研究,最后确定了如下两条语句:

set @BeginDate = convert(varchar(8),getdate(),120)+’1 00:00:000′

set @EndDate = convert(varchar(20),dateadd(day,-1,convert(varchar(8),dateadd(m,1,getdate()),120)+’1 23:59:59′),120)

这样返回的数据是:2006-04-1 00:00:000
                                    2006-04-30 23:59:59

这样就得到了月初和月末的日期加上时间的表示了。

ColumnA                          ColumnB                               ColumnC
1                                             abc                                     5
1                                             def                                     4
1                                             ghi                                     9
2                                             jkl                                      8
2                                            mno                                    3
这是表 table
如果 ColumnA 是分组列,要引用 ColumnBColumnC,这两列必须能为 ColumnA 中的每个值返回单个值的聚合函数中的参数。
SELECT ColumnA,
       MAX(ColumnB) AS MaxB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA

而这样却是错误的。
SELECT ColumnA,
       ColumnB,
       SUM(ColumnC) AS SumC
FROM TableX
GROUP BY ColumnA
原因在于
由于 GROUP BY 关键字只能返回一行,该行 ColumnA 中的值为 1,因此无法返回与 ColumnA 中的值 1 关联的 ColumnB 的三个值(abc、def 和 ghi)。

如果是这样分组后,那么就只能获得分组子句中的字段的值了。那假如想获得分组子句外的字段的值那既是不合理的也是不可能的。

在sql中,max函数返回表达式的最大值。这个函数只能带一个参数,取一列值中最大的值。
但是现在有两个参数,我想比较这两个参数,并且取的中间的大值,应该如何做呢?

  SELECT  str_CompanyID,str_kehuID,str_shangpid,str_mudg FROM  Sale_View_Kehxjzidongbj
  WHERE str_cuxbj =’b’ and len(str_kehuid)>0 and len(str_shangpid)>0
   GROUP BY str_CompanyID,str_kehuID,str_shangpid,str_mudg
原来以为group by 子句在查询的时候,指定where条件的时候,条件必须是用来分组的字段,后来发现是可以指定别的字段来进行判断的。

select str_cuxbj,count(*) from sale_customermtl where str_userid=’indiakk’  group by str_cuxbj
       该语句是想按照str_cuxbj分组进行处理,同时计算出每种情况的记录都有多少条。
       NULL 108
       a           30
       这是运行结果。但是如果使用下面的语句
       select str_cuxbj,count(str_cuxbj) from sale_customermtl where str_userid=’indiakk’  group by str_cuxbj
       NULL 0
       a         30
       运行的结果却是这样的。奇怪!
       select count(str_cuxbj) from sale_customermtl where str_userid=’indiakk’ and str_cuxbj is null
       然后用上面的语句试着查询一下 结果是 0
       初步猜想是这样的,就是count(*)的时候,统计的是str_cuxbj为null的记录数。
        当count(str_cuxbj)的时候,聚合函数对于null就不感冒了,当遇到了null的时候,聚合函数就象不认识一样,所以就统计不了总和了。但是当你将null换为a 的话,马上就能统计出来是30。
       这个聚合函数倒是够让人动脑子的,并且sql对于null的处理往往出人意料,看来对于sql中聚合函数,null值的处理以后都要小心谨慎为妙啊!不然出了问题都不知道是怎么回事!