Archive

Archive for the ‘Sql Server’ Category

使用ADO.net连接SQL Server镜像数据库

July 9th, 2009 Tony hu No comments

可能有朋友们会比较有疑惑,SQL Server 做镜像时有两个数据库服务器,他们的ip地址不一样,到时候数据库切换过去了,我的数据库的连接字符串可如何是好?难道还得在代码中去控制是连接哪个数据库吗?
其实这个问题是这样的,使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示:

ConnectionString=”DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;”

DataSource= A;这个就是我们常用的主数据库的ip地址,Failover Partner=B;这个填写的就是镜像数据库的ip地址,一旦出现了连接错误,Ado.NET会在超时以后自动去连接镜像数据库。

SET NOCOUNT { ON | OFF }讲解

July 7th, 2009 Tony hu No comments

当 SET NOCOUNT 为 ON 时,不返回计数(表示受Transact-SQL 语句影响的行数)。
当 SET NOCOUNT 为 OFF 时,返回计数。

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft® SQL Server™ 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示”nn rows affected”。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。注释当SET NOCOUNT 为ON 时,不返回计数(表示受Transact-SQL 语句影响的行数)。当SET NOCOUNT 为OFF 时,返回计数。 

 结论:我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话,在退出存储过程的时候加上SET NOCOUNT OFF这样的话,以达到优化.

源文1:http://blog.163.com/tl_jerome/blog/static/465007142007830114518525/
源文2:http://hi.baidu.com/livbirds/blog/item/72fc7dcb9420aefb53664f4c.html

Categories: Database, Sql Server Tags:

SQL Union和SQL Union All用法介绍

July 1st, 2009 Tony hu No comments
今天遇到一个问题,将一个表中的两列(Column A, Column B) 数据合并一列,而且需要将Column B内容接在Column A的后面,感谢下面的博文帮我解决了这个问题,转来和大家一起分享。——Tony Hu

 

UNION 指令的目的是将两个 SQL 语句的结果合并起来。从这个角度来看, UNIONJOIN 有些许类似,因为这两个指令都可以由多个表格中撷取资料。 UNION 的一个限制是两个 SQL 语句所产生的栏位需要是同样的资料种类。另外,当我们用 UNION这个指令时,我们只会看到不同的资料值 (类似 SELECT DISTINCT)。 union只是将两个结果联结起来一起显示,并不是联结两个表…………
假设我们有以下的两个表格
Store_Information 表格

store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格

Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出来所有有营业额 (sales) 的日子。要达到这个目的,我们用以下的 SQL 语句:
SELECT Date FROM Store_Information
UNION
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999
有一点值得注意的是,如果我们在任何一个 SQL 语句 (或是两句都一起) 用 “SELECT DISTINCT Date” 的话,那我们会得到完全一样的结果。

SQL Union All
UNION ALL 这个指令的目的也是要将两个 SQL 语句的结果合并在一起。 UNION ALLUNION 不同之处在于 UNION ALL 会将每一笔符合条件的资料都列出来,无论资料值有无重复。
UNION ALL
我们用和上一页同样的例子来显示出 UNION ALLUNION 的不同。同样假设我们有以下两个表格,

Store_Information 表格

store_name Sales Date
Los Angeles $1500 Jan-05-1999
San Diego $250 Jan-07-1999
Los Angeles $300 Jan-08-1999
Boston $700 Jan-08-1999
Internet Sales 表格

Date Sales
Jan-07-1999 $250
Jan-10-1999 $535
Jan-11-1999 $320
Jan-12-1999 $750
而我们要找出有店面营业额以及网络营业额的日子。要达到这个目的,我们用以下的 SQL 语句:
SELECT Date FROM Store_Information
UNION ALL
SELECT Date FROM Internet_Sales
结果:
Date
Jan-05-1999
Jan-07-1999
Jan-08-1999
Jan-08-1999
Jan-07-1999
Jan-10-1999
Jan-11-1999
Jan-12-1999

 

来源:http://brucezheng.javaeye.com/blog/70300

Categories: Database, Sql Server Tags: ,

串口基础

June 19th, 2009 Tony hu 1 comment

串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:
a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步

来源:http://hi.baidu.com/yanguang1670/blog/item/96e02dd16953e2da572c84cc.html

Categories: Sql Server Tags:

一个很长的SQL,花了我一天的时间

June 11th, 2009 Tony hu No comments

从昨天下午三点开始做这一个查询,到今天下午两点钟,终于搞定了。

BEGIN
Set @tsql=’Select C.CheckerID,C.CheckerName,isnull(D.date1,D.date2) date1,D.CSum1,D.QTY1,D.CSum2,D.QTY2
from (Select CheckerID, CheckerName from CheckerList where CheckerType=1) C
full join
(Select A.CSum1,A.QTY1,B.CSum2,B.QTY2,A.date1,B.date2,A.Checker Checker1,B.Checker Checker2 From
(Select count(CarQTY) as CSum1,sum(cast(CarQTY as bigint))  as QTY1,
CONVERT(varchar(100), FormDate, 23) date1,Checker
from FeedBack
where FormDate between ”’+@StartDate+”’ and ”’+@EndDate+”’
and (FeedBackType=1 or FeedBackType=2)
group by  CONVERT(varchar(100), FormDate, 23),Checker) A
full join
(Select count(CarQTY) as CSum2,sum(cast(CarQTY as bigint))  as QTY2,
CONVERT(varchar(100), FormDate, 23) date2,Checker
from FeedBack
where FormDate between ”’+@StartDate+”’ and ”’+@EndDate+”’
and (FeedBackType=3 or FeedBackType=4)
group by  CONVERT(varchar(100), FormDate, 23),Checker) B
On ( A.Checker=B.Checker and A.date1=B.date2)
) D
On (C.CheckerName=D.Checker1 or C.CheckerName=D.Checker2)
order by C.CheckerID’
END

下面附上两个图:(查询分析图,程序最终UI图)

sql_server_ffsa

capsugel_ffsa_ui

这个里面用了两个比较重要的full join, 以前一直觉得full join 用的情况不多,这一次总算帮我我的忙了。
情况是这样的,t1 表中有数据,t2表中也有数据,两个表中的某些字段相同时需要将两个表中的值合并,不相同时也需要列出来,但是需要将数据以每一个操作工,每天的情况列出来,如果操作工没有数据,也需在将操作工的名字列出来。
OK, 人才。

Categories: Database, Sql Server Tags: , ,