2006-09-29

在 MS SQL Server 中限制返回记录数量的 3 种方法

在使用海量数据的时候,限制返回记录的数量是必须的,将所有记录返回很容易使数据库陷入死状态。

对于 Microsoft SQL Server 来说,提供了3种方法来完成这个功能:

1. 使用 TOP 选项。TOP 选项提供了最简单的方式限制返回记录数量,语法如下:

SELECT [ TOP (expression) [ PERCENT ] [ WITH TIES ]] select_list [ other_select_command ]

参数

1. expression. 指定返回行数量的数值,可以是常量或者变量。如果指定了 PERCENT ,则 expression 将转换为 float 类型;如果没有指定 PERCENT ,则 expression 将转换为 bigint 类型。如果查询中包含 ORDER BY 子句,则返回的记录集为排序后的前项记录;如果没有包含 ORDER BY 子句,则返回行的顺序是随意的。

2. PERCENT. 指示限定记录数量的类型。如果指定了 PERCENT ,则按照总数量的百分比计算返回数量;如果没有指定 PERCENT , 则按照返回记录集的行数量来计算。

3. WITH TIES. 指示返回额外的行,只能与 ORDER BY 一起使用。使用此选项时,排序后返回指定数量的记录行,与这些记录集最后一行排序字段相同的行也会返回。所以,返回记录的数量可能会比指定数量要大。

示例代码

SELECT TOP (10) * FROM table1 ORDER BY column1

2. 使用 SET ROWCOUNT 选项。 SET ROWCOUNT 改变了当前环境下返回记录数量的值,语法如下:

SET ROWCOUNT expression

参数

1. expression. 在停止特定查询之前要处理的行数,可以是常量或变量,类型为整形。

执行此命令后, SQL Server 将在执行 SELECT 语句时,返回指定的行数后停止查询。如果需要关闭此选项,执行 SET ROWCOUNT 0 即可。

示例代码

SET ROWCOUNT 10
SELECT * FROM table1 ORDER BY column1
SET ROWCOUNT 0

3. 使用 ROW_NUMBER 函数。 ROW_NUMBER 函数返回当前行对应的行号,每个分区的第一行从 1 开始,语法如下:

ROW_NUMBER ( ) OVER ( [ PARTITION BY partition_name [ , partition_name ] ] ORDER BY order_name [ , order_name ] )

参数

1. partition_name. 根据此列名确认 ROW_NUMBER 函数结果集分区范围。如果此字段未填,则所有计算行号;如果此字段填写,则根据相同结果集分区的记录计算行号,结果集分区不同的记录重新从1开始计算行号。

2. order_name. 根据此列名确定返回行的顺序,计算出行号。

示例代码

SELECT * FROM ( SELECT *, ROW_NUMBER ( ) OVER ( ORDER BY column1 ) AS rowNumber FROM table1 ) AS T WHERE rowNumber < 10

上面列出了 SQL Server 限制返回记录数量的 3 种方法,这 3 种方法均支持常量和变量。 TOP 的使用方法最简单,如果仅仅是限制返回数量,建议使用这种方式;如果要进行分页和结果集分区计算,那么就要使用 ROW_NUMBER 函数了。

2006-09-27

侠客行

作者:李白

赵客缦胡缨,吴钩霜雪明。
银鞍照白马,疯沓如流星。

十步杀一人,千里不留行。
事了拂衣去,深藏身与名。

闲过信陵饮,脱剑膝前横。
将炙啖朱亥,持觞劝侯嬴。

三杯吐然诺,五岳倒为轻。
眼花耳热后,意气素霓生。

救赵挥金锤,邯郸先震惊。
千秋二壮士,烜赫大梁城。

纵死侠骨香,不惭世上英。
谁能书阁下,白首太玄经?

2006-09-26

Beautiful Life

Artist: Ace of Base

You can do what you want
Just seize the day
What you're doing tomorrow's
Gonna come your way
Don't you ever consider giving up
You will find, oooh

It's a beautiful life, oooh
It's a beautiful life, oooh
It's a beautiful life, oooh
I wanna be here beside you
And stay until the break of dawn

Take a walk in the park when you feel down
There're so many things there
That's gonna lift you up
See the nature in bloom a laughing child
Such a dream, oooh

I wanna be here beside you
I wanna be here beside you
And stay until the break of dawn
You're looking for somewhere to belong
You're standing all alone
For someone to guide you on your way
Now and forever, oooh

I just wanna be anybody
We're living in different ways
It's a beautiful life

I'm gonna take you to a place
I've never been before
Oh, yeah
It's a beautiful life

I'm gonna take you in my arms
And fly away with you tonight
Oh, yeah, alright
It's a beautiful life
Yeah, alright
It's a beautiful life

It's a beautiful life

It's a beautiful life

2006-09-25

使用 HttpWebRequest 向网站提交数据

HttpWebRequest 是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过 HTTP 协议和服务器交互。

HttpWebRequest 对 HTTP 协议进行了完整的封装,对 HTTP 协议中的 Header, Content, Cookie 都做了属性和方法的支持,很容易就能编写出一个模拟浏览器自动登录的程序。

程序使用 HTTP 协议和服务器交互主要是进行数据的提交,通常数据的提交是通过 GET 和 POST 两种方式来完成,下面对这两种方式进行一下说明:

1. GET 方式。 GET 方式通过在网络地址附加参数来完成数据的提交,比如在地址 http://www.google.com/webhp?hl=zh-CN 中,前面部分 http://www.google.com/webhp 表示数据提交的网址,后面部分 hl=zh-CN 表示附加的参数,其中 hl 表示一个键(key), zh-CN 表示这个键对应的值(value)。程序代码如下:

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "http://www.google.com/webhp?hl=zh-CN" );
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理
}

2. POST 方式。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交,参数的格式和 GET 方式一样,是类似于 hl=zh-CN&newwindow=1 这样的结构。程序代码如下:

string param = "hl=zh-CN&newwindow=1";
byte[] bs = Encoding.ASCII.GetBytes(param);

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "http://www.google.com/intl/zh-CN/" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = bs.Length;

using (Stream reqStream = req.GetRequestStream())
{
   reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理
}

在上面的代码中,我们访问了 www.google.com 的网址,分别以 GET 和 POST 方式提交了数据,并接收了返回的页面内容。然而,如果提交的参数中含有中文,那么这样的处理是不够的,需要对其进行编码,让对方网站能够识别。

3. 使用 GET 方式提交中文数据。 GET 方式通过在网络地址中附加参数来完成数据提交,对于中文的编码,常用的有 gb2312 和 utf8 两种,用 gb2312 方式编码访问的程序代码如下:

Encoding myEncoding = Encoding.GetEncoding("gb2312");
string address = "http://www.baidu.com/s?" + HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding);
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(address);
req.Method = "GET";
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理
}

在上面的程序代码中,我们以 GET 方式访问了网址 http://www.baidu.com/s ,传递了参数“参数一=值一”,由于无法告知对方提交数据的编码类型,所以编码方式要以对方的网站为标准。常见的网站中, www.baidu.com (百度)的编码方式是 gb2312, www.google.com (谷歌)的编码方式是 utf8。

4. 使用 POST 方式提交中文数据。 POST 方式通过在页面内容中填写参数的方法来完成数据的提交,由于提交的参数中可以说明使用的编码方式,所以理论上能获得更大的兼容性。用 gb2312 方式编码访问的程序代码如下:

Encoding myEncoding = Encoding.GetEncoding("gb2312");
string param = HttpUtility.UrlEncode("参数一", myEncoding) + "=" + HttpUtility.UrlEncode("值一", myEncoding) + "&" + HttpUtility.UrlEncode("参数二", myEncoding) + "=" + HttpUtility.UrlEncode("值二", myEncoding);

byte[] postBytes = Encoding.ASCII.GetBytes(param);

HttpWebRequest req = (HttpWebRequest) HttpWebRequest.Create( "http://www.baidu.com/s" );
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded;charset=gb2312";
req.ContentLength = postBytes.Length;

using (Stream reqStream = req.GetRequestStream())
{
   reqStream.Write(bs, 0, bs.Length);
}
using (WebResponse wr = req.GetResponse())
{
   //在这里对接收到的页面内容进行处理
}

从上面的代码可以看出, POST 中文数据的时候,先使用 UrlEncode 方法将中文字符转换为编码后的 ASCII 码,然后提交到服务器,提交的时候可以说明编码的方式,用来使对方服务器能够正确的解析。

以上列出了客户端程序使用 HTTP 协议与服务器交互的情况,常用的是 GET 和 POST 方式。现在流行的 WebService 也是通过 HTTP 协议来交互的,使用的是 POST 方法。与以上稍有所不同的是, WebService 提交的数据内容和接收到的数据内容都是使用了 XML 方式编码。所以, HttpWebRequest 也可以使用在调用 WebService 的情况下。

2006-09-21

ASP.NET 1.1 基于Forms的身份验证

ASP.NET 1.1 中已包含 Windows, Forms, Passport 三种身份验证功能,其中 Windows 是基于 Windows 操作系统的用户验证,Passport 是基于 Microsoft Passport 的用户验证,这两种的适用范围都太窄,而 Forms 验证则可以手动控制用户登录过程,比较适合使用。
构建基于 Forms 的身份验证过程如下:
1. 设置 IIS 为可匿名访问,在 asp.net 配置文件 web.config 中设置验证模式为 Forms 验证,并设置登录页面。
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name="name" loginUrl="/login.aspx" protection="None" timeout="30" path="/" requireSSL="false" slidingExpiration="false" />
    </authentication>
  </system.web>
</configuration>
2. 处理用户登录逻辑,查询出用户所属于的角色。
3. 构造 FormsAuthenticationTicket 对象,将其加密后保存到 cookie 中。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
     1,
     userName,
     DateTime.Now,
     DateTime.Now.AddMinutes(30),
     isPersistent,
     "roleA,roleB,roleC",  //角色列表,用逗号区分,可以自定义
     FormsAuthentication.FormsCookiePath);

string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
4. 在 AuthenticateRequest 事件中( Global.asax 中包含一个对应的默认函数 Application_AuthenticateRequest ),恢复出 FormsAuthenticationTicket 对象,创建对应的 IPrincipal 对象并保存在 HttpContext.User 中。
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie!=null)
{
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    string[] roles = authTicket.UserData.Split(new char[]{','});
    Context.User = new GenericPrincipal(Context.User.Identity, roles);
}
5. 对指定页面设定角色控制。
1. 在子目录中添加 web.config 配置文件,修改对整个子目录的访问权限。
<configuration>
  <system.web>
    <authorization>
      <allow roles="RoleName" />
      <deny users="*" />
    </authorization>
  </system.web>
</configuration>
2. 修改当前目录的 web.config 配置文件,为单独的页面修改访问权限。
<configuration>
  <system.web>
    <location path="EditPost.aspx">
      <system.web>
        <authorization>
          <allow roles="RoleName" />
          <deny users="*" />
        </authorization>
      </system.web>
    </location>
  </system.web>
</configuration>
3. 直接在页面中判断用户对应的角色。
if (User.IsInRole("RoleA"))
{
    //用户属于角色 RoleA ,处理...
}
4. 以上步骤均可以达到需要的效果,优先级为1>2>3。

2006-09-20

登广武古战场怀古

作者:李白

秦鹿奔野草,逐之若飞蓬。
项王气盖世,紫电明双瞳。
呼吸八千人,横行起江东。
赤精斩白帝,叱咤入关中。

两龙不并跃,五纬与天同。
楚灭无英图,汉兴有来功。
按剑清八极,归酣歌大风。
伊昔临广武,连兵决雌雄。

分我一杯羹,太皇乃汝翁。
战争有古迹,壁垒颓层穹。
猛虎啸洞壑,饥鹰鸣秋空。
翔云列晓阵,杀气赫长虹。

拨乱属豪杰,俗儒安可通。
沈湎呼竖子,狂言非至公。
抚掌黄河曲,嗤嗤阮嗣宗。

2006-09-19

将进酒

作者:李白

君不见黄河之水天上来,奔流到海不复回。
君不见高堂明镜悲白发,朝如青丝暮成雪。

人生得意须尽欢,莫使金樽空对月。
天生我材必有用,千金散尽还复来。
烹羊宰牛且为乐,会须一饮三百杯。

岑夫子,丹丘生,将进酒,君莫停。
与君歌一曲,请君为我侧耳听。

钟鼓馔玉不足贵,但愿长醉不愿醒。
古来圣贤皆寂寞,惟有饮者留其名。
陈王昔时宴平乐,斗酒十千恣欢谑。
主人何为言少钱,径须沽取对君酌。

五花马,千金裘,
呼儿将出换美酒,与尔同销万古愁。

2006-09-17

名言影视篇

Family is everything.
------ John Musgrave, Mission: Impossible III

You know, when you want something really bad, and you close your eyes, and you wish for it? God's the guy that ignores you.
------ McCord, The Island

Good morning, and in case I don't see ya, good afternoon, good evening, and good night!
------ Truman Burbank, The Truman Show

Never hate your enemies. It affects your judgment.
------ Michael Corleone, The Godfather: Part III

You have a divine spark. You have a gift for bringing joy and laughter to the world.
------ God, Bruce Almighty

2006-09-16

菊花台

演唱:周杰伦

你的泪光,柔弱中带伤,
惨白的月弯弯勾住过往。
夜太漫长,凝结成了霜,
是谁在阁楼上冰冷的绝望。

雨轻轻弹,朱红色的窗,
我一生在纸上被风吹乱。
梦在远方,化成一缕香,
随风飘散你的模样。

菊花残,满地伤,你的笑容已泛黄,
花落人断肠,我心事静静淌。
北风乱,夜未央,你的影子剪不断,
徒留我孤单,在湖面成双。

花已向晚,飘落了灿烂,
凋谢的世道上,命运不堪。
愁莫渡江,秋心拆两半,
怕你上不了岸,一辈子摇晃。

谁的江山,马蹄声狂乱,
我一身的戎装,呼啸沧桑。
天微微亮,你轻声地叹,
一夜惆怅,如此委婉。

菊花残,满地伤,你的笑容已泛黄,
花落人断肠,我心事静静淌。
北风乱,夜未央,你的影子剪不断,
徒留我孤单,在湖面成双。

问刘十九

作者:白居易

绿蚁新醅酒,红泥小火炉。
晚来天欲雪,能饮一杯无?

2006-09-15

夜的第七章

演唱:周杰伦

1983年小巷,12月晴朗,
夜的第七章,
打字机继续推向接近事实的那下一行。

石楠烟斗的雾,雾,
飘向枯萎的树,树,
沉默的对我哭诉。

贝克街旁的圆形广场,
盔甲骑士臂上,
鸢尾花的徽章,微亮。

无人马车声响,深夜的拜访,
邪恶在维多利亚的月光下。
血色的开场,消失的手枪,
焦黑的手杖,融化的蜡像,
谁不在场。

珠宝箱上符号的假象,
矛盾通往他堆砌的死巷,
证据被完美埋葬,
那嘲弄苏格兰警场的嘴角上扬。

如果邪恶是华丽残酷的乐章,
(那么正义是深沉无奈的惆怅)
它的终场我会亲手写上,
(那我就点亮在灰烬中的微光)
晨曦的光风干最后一行忧伤,
(那么雨滴会洗净黑暗的高墙)
黑色的墨染上安详。
(散场灯关上红色的布幕下降)

事实只能穿向没有脚印的土壤,
突兀的细微花香,刻意显眼的服装。
每个人为不同的理由带着面具说谎,
动机也只有一种名字那叫做欲望。

越过人心的沼泽,谁真的可以不被弄脏,
我们可以遗忘原谅,但必须知道真相。

被移动过的铁床,
那最后一块图终于拼上。
我听见脚步声,
预料的软皮鞋跟他推开门。
晚风晃了煤油灯一阵,
打字机停在凶手的名称我转身。

西敏寺的夜空开始沸腾,
在胸口绽放艳丽的死亡。
我品尝这最后一口甜美的真相,
微笑回想正义只是安静的伸张。

提琴在泰晤士,
我听见脚步声,
预料的软皮鞋跟他推开门。
晚风晃了煤油灯一阵,
打字机停在凶手的名称我转身。

西敏寺的夜空开始沸腾,
黑色的墨染上安详。

如果邪恶是华丽残酷的乐章,
它的终场我会亲手写上。
晨曦的光风干最后一行忧伤,
黑色的墨染上安详。

2006-09-14

典雅

二十四诗品之六,典雅

作者:司空图

玉壶买春,赏雨茅屋。
坐中佳士,左右修竹。
白云初晴,幽鸟相逐。
眠琴绿阴,上有飞瀑。
落花无言,人淡如菊。
书之岁华,其曰可读。

2006-09-12

将军

演唱:周杰伦

时间的箭头,都指向你铩羽而归的地方,
你会前进,但终究还是得要习惯投降。
想当然尔,第六步是你最大的致命伤,
我按兵不动,出于习惯凡事沉默的酝酿。

当头炮,纯粹出于我礼貌的开场;
屏风马,神华内敛才能以柔克刚。
第二十六着,炮五进四,
只是在试探性衡量。
三十三着,车二平七,
出手你恐怕就暗箭难防。

这一场不流血的仗,只有自尊会受伤。
成王败寇的铁则,跟现实没什么两样。

提着鸟笼的老头站在一旁拍我肩膀,
我猜他想的应该和我一样。

看我,我手指放松,我目光如龙。
当敌人是空,我战法无穷,我攻势如风。
用单车入宫,辗过你懊丧的脸孔。

管我,我手指放松,我目光如龙。
当敌人是空,我左右开弓,我气势如虹。
将炮马尽用,兵临城下想逃都没用。

我对着潮汐推敲,什么是以静制动。
山林间迷雾,能不能当障眼法的内容,
月转星移的轨迹,跟临军布阵相同。
风林火山是不是用兵之重。

到最后必然是我运筹帷幄,你最后放弃抵抗。
我仰望着夕阳,你低头黯然离场。
听我说胜败是兵家之常,你不用放在心上,
是因为我只适合无双。
(阳光从树叶细缝,露出了笑容,温暖了我的美梦,
只有笼里的画眉羡慕着天空,却从来没有人懂)

2006-09-09

马太福音的寓言

基督教
新约全书,马太福音第25章


天国又好比一个人要往外国去,就叫了仆人来,把他的家业交给他们。
按着各人的才干,给他们银子。一个给了五千,一个给了二千,一个给了一千。就往外国去了。

那领五千的,随即拿去做买卖,另外赚了五千。
那领二千的,也照样另赚了二千。
但那领一千的,去掘开地,把主人的银子埋藏了。

过了许久,那些仆人的主人来了,和他们算账。

那领五千银子的,又带着那另外的五千来,说,主阿,你交给我五千银子,请看,我又赚了五千。
主人说,好,你这又良善又忠心的仆人。你在不多的事上有忠心,我要把许多事派你管理。可以进来享受你主人的快乐。

那领二千的也来说,主阿,你交给我二千银子,请看,我又赚了二千。
主人说,好,你这又良善又忠心的仆人。你在不多的事上有忠心,我要把许多事派你管理。可以进来享受你主人的快乐。

那领一千的,也来说,主阿,我知道你是忍心的人,没有种的地方要收割,没有散的地方要聚敛。我就害怕,去把你的一千银子埋藏在地里。请看,你的原银子在这里。
主人回答说,你这又恶又懒的仆人,你既知道我没有种的地方要收割,没有散的地方要聚敛。就当把我的银子放给兑换银钱的人,到我来的时候,可以连本带利收回。夺过他这一千来,给那有一万的。

因为凡有的,还要加给他,叫他有余。没有的,连他所有的,也要夺过来。

2006-09-06

Teardrop

Artist: Massive Attack

Love, love is a verb
Love is a doing word
Feathers on my breath
Gentle impulsion
Shakes me makes me lighter
Feathers on my breath

Teardrop on the fire
Feathers on my breath

In the night of matter
Black flowers blossom
Feathers on my breath
Black flowers blossom
Feathers on my breath

Teardrop on the fire
Feathers on my breath

Water is my eye
Most faithful my love
Feathers on my breath
Teardrop on the fire of a confession
Feathers on my breath
Most faithful my love
Feathers on my breath

Teardrop on the fire
Feathers on my breath

Stumbling a little
Stumbling a little

2006-09-04

I'll Be There For You

Artist: The Rembrandts

So, no one told you life was going to be this way,
Your job's a joke, you're broke, your live life's D.O.A.
It's like you're always stuck in second gear,
Well, it hasn't been your day, your week, your month, or even your year. But

I'll be there for you when the rain starts to pour,
I'll be there for you like I've been there before,
I'll be there for you 'cause you're there for me too.

You're still in bed at ten, and work began at eight,
You've burned your breakfast, so far, things are going great,
Your mother warned you there'd be days like these,
But she didn't tell you when the world has brought you down to your knees, that

I'll be there for you when the rain starts to pour,
I'll be there for you like I've been there before,
I'll be there for you 'cause you're there for me too.

No one could ever know me, no one could ever see me,
Seems you're the only one who knows what it's like to be me,
Someone to face the day with, make it through the rest with,
someone I'll always laugh with. Even at my worst, I'm best with you. Yeah

It's like you're always stuck in second gear,
Well, it hasn't been your day, your week, your month, or even your year. But

I'll be there for you when the rain starts to pour,
I'll be there for you like I've been there before,
I'll be there for you 'cause you're there for me too.

2006-09-03

江雪

作者:柳宗元

千山鸟飞绝,万径人踪灭。
孤舟蓑笠翁,独钓寒江雪。

2006-09-01

飞龙在天,利见大人

《易经》

同声相应,同气相求;
水流湿,火就燥;
云从龙,风从虎。
圣人作,而万物(者+见),
本乎天者亲上,本乎地者亲下,则各从其类也。