一切福田,不離方寸,從心而覓,感無不通。

Category Archives: Backend

请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径,解决方案

在应用程序中的服务器错误"<application name >" ——————————————————————————-- HTTP 错误 404.8 – HIDDEN_NAMESPACE HRESULT: 0 HRESULT 的说明 # 操作成功完成。     要解决此问题,请按下列步骤操作:单击 开始 、 在 开始搜索 框中键入 记事本 右键单击 记事本 ,然后单击 以管理员身份运行 。 请注意 如果将提示您输入管理员密码或进行确认,键入该的密码,或单击 继续 。 在 文件 菜单上单击 打开 ,在 文件名 框中键入 %windir%\System32\inetsrv\config\applicationHost.config 然后再单击 打开 。 在该 ApplicationHost.config 文件中找到在 <requestfiltering>元素,然后找到该 <hiddensegments>元素。 在该 <hiddensegments>元素,删除与所请求的 URL 中指定的目录匹配的条目。 在 文件 菜单中上, 单击 保存 。 退出记事本。 本文所有权归作者,欢迎转载,但是请指明出处 :http://www.cnblogs.com/fly871117 ,严谨用于商业用途

龙生   24 Aug 2013
View Details

给 C# 开发者的代码审查清单

这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考。这是为了确保在编码过程中,大部分通用编码指导原则都能注意到。对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助。 清单 1. 确保没有任何警告(warnings)。 2.如果先执行Code Analysis(启用所有Microsoft Rules)再消除所有警告就更好了。 3. 去掉所有没有用到的usings。编码过程中去掉多余代码是个好习惯。(参考:msdn) 4. 在合理的地方检查对象是否为’null’,避免运行的时候出现Null Reference Exception。  5. 始终遵循命名规范。一般而言变量参数使用驼峰命名法,方法名和类名使用Pascal命名法。(参考:msdn) 6. 请确保你了解SOLID原则。 根据维基百科定义:在程序设计领域,SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转) 是由罗伯特·C·马丁在21世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则。当这些原则被一起应用时,它们使得一个 程序员开发一个容易进行软件维护和扩展的系统变得更加可能。SOLID所包含的原则是通过引发编程者进行软件源代码的代码重构进行软件的代码异味清扫,从而使得软件清晰可读以及可扩展时可以应用的指南。SOLID被典型的应用在测试驱动开发上,并且是敏捷开发以及自适应软件开发的基本原则的重要组成部分。参考:wiki/SOLID_(面向对象设计) 7. 代码可重用性:如果一块代码已经被使用超过一次,或者你希望将来使用它,请提取成一个方法。将重复的工作做成通用的方法放在相关的类中,这样一旦你完成别人就可以使用了。将常用功能开发成用户控件,这样可以跨项目重用它们。(参考:① 、 ②) 8. 代码一致性:比方说,Int32写成int,String写成string,应该在代码里保持统一形式。不能一会二写成int一会儿写成Int32。 9. 代码可读性:代码应该是可维护的,便于其他开发者理解。(参考:msdn) 10. 释放非托管资源,比如文件I/O,网络资源等。一旦使用结束就应该释放它们。如果你想一旦超出使用范围就自动释放对象,可以使用usings将非托管代码括起来。参考:msdn 11. 合理实现异常处理(try/catch和finally块)和异常记录。参考:msdn 12. 确保代码中方法的行数不要过多,不超过30到40行。 13. 及时用代码管理工具check-in/check-out代码。(比如TFS) 参考:codeproject.com 14. 相互审查代码:和你的同事交换代码,实现内部审查。 15. 单元测试:编写开发测试用例完成单元测试,确保代码被送到QA以前,基本测试完成。参考:msdn 16. 尽量避免for/foreach循环嵌套和if条件嵌套。 17. 如果代码只会使用一次,请使用匿名类型。参考:msdn 18. 尽量使用LINQ查询和Lambda表达式,增加可读性。参考:msdn 19. 合理使用var、object和dynamic关键字。由于很多开发者会感到困惑或者知道的很少,会觉得它们有些相似,故而交换使用,这是要避免的。参考:blogs.msdn 20. 使用访问限定符(private, public, protected, internal, protected internal)限定每个方法、类或变量的需要范围。比方说如果一个类只会在程序集内使用,那么定义成internal就足够了。参考:msdn 21. 在需要保持解耦的地方使用接口,有些设计模式的出现也是由于接口的使用。参考:msdn 22. 按照用法和需要将类定义为sealed、static或abstract。参考:msdn 23. 如果需要多次串联,请使用Stringbuilder代替string,这可以节省堆内存。 24. 检查是否有不可能执行的代码,如果有,请修改。 25. 在每个方法前注释,说明它的用法、输入类型和返回值类型信息。 26. 使用类似Silverlight Spy的工具,检查和操控Silverlight应用在运行时对XMAL的渲染,以此来改善效率。这可以在设计执行XAML时,节省大量退回和来回修改的时间。 27. 使用filddler工具通过检查HTTP/网络流量和带宽,来跟踪web应用和服务的性能。 28. 如果你想确认Visual Studio以外的方法,请使用WCFTestClient.exe工具,或者装载它的进程到Visual Studio来进行调试。 29. 在任何合理的地方使用constants和readonly。参考:/msdn、msdn 30. 尽量避免强制转换和类型转换,因为会造成性能损失。参考:msdn 31. 对于你想提供自定义信息的类,请重载ToString(来自Object类)。参考:msdn 32. 避免直接从其他代码中ctrl+c/ctrl+v。一直建议还是自己用手敲,即使你已经找到相关代码。这样可以锻炼自己写代码能力,还能正确理解那段代码的用法。最终你永远都不会忘记那段代码。 33. 保持阅读书籍和文章的良好习惯,遵循大神们的实践指导。(比如微软专家和一些著名的专家,Martin Fowler, Kent Beck, Jeffrey Ritcher, Ward […]

龙生   24 Aug 2013
View Details

Node.js中所用的fs.renameSync出错:Error: EXDEV, cross-device link no

Win7下,折腾Node.js过程中,运行服务器,其中内部调用相关代码: function show(response) {   console.log("Request handler 'show' was called.");   fs.readFile("/tmp/test.png", "binary", function(error, file)   {     if(error) {       response.writeHead(500, {"Content-Type": "text/plain"});       response.write(error + "\n");       response.end();     } else {       response.writeHead(200, {"Content-Type": "image/png"});       response.write(file, "binary");       response.end();     }   }); } 去重命名,结果出错: D:\tmp\tmp_dev_root\node.js> D:\tmp\tmp_dev_root\node.js>node index.js Server has started. Reforst for /upload received. About to route a reforst for /upload Request ha’upload’pload' was called. about to parse padoneg done   fs.js:returnreturn binding.rename(pathModule._makeLong(oldPath),                  ^ Error: EXDEV, cross-device link not perm’C:\Users\CLi\AppData\Local\Temp\df99513a93a1cbfbc26e076f8ae08b92’08b92′     at Object.fs.renameSync (fs.js:439:18)     at D:\tmp\tmp_dev_root\node.js\requestHandlers.js:34:8     at IncomingForm.parse (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:121:9)     at IncomingForm.EventEmitter.emit (events.js:93:17)     at IncomingForm._maybeEnd (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:383:8)     at IncomingForm.handlePart (D:\tmp\tmp_dev_root\node.js\node_modules\formidable\lib\incoming_form.js:212:12)     at File.end (D:\tmp\tmp_dev_root\node.js\node_modules\formidablfileb\file.js:71:5)     at WriteStream.flush (fs.js:1515:9)     at Object.oncomplete […]

龙生   22 Aug 2013
View Details

为什么软件开发周期通常是预期的两三倍?

导读:有国外开发者在 Quora 提了这个问题:“为什么软件开发周期通常是预期的两三倍?” 并补充问:“这是开发人员的错误? 是管理失误? 是因为做事方法不对, 或者说缺乏好的方法?还是说这就是软件开发流程的特点?” Michael Wolfe 在2012年1月28日给的回复,非常经典,截至我们发布时已有8016个赞。以下是译文。 让我们先沿着海岸线,从旧金山(SF)走路去洛杉矶(LA),去拜访我们住在Newport Beach的朋友,我拿出地图在上面画出了行进路线。 全程大约有400英里,如果我们每天走10小时每小时4公里的话,只用10天就可以到达目的地。立刻打电话给我们的朋友预定下周六的晚餐,告诉他们下周六晚上六点我们一定会准时出现,朋友们已经等不及了! 第二天清晨,我们带着准备冒险的兴奋起床,背起行囊,拿出地图,准备计划我们冒险的第一天,看一眼地图,噢,不! 哇,海岸线上有这么多迂回曲折的线路。每天行进40英里的话,10天后只能勉强到达Half Moon Bay(半月湾?)。这趟旅行至少有500英里,而不是400。赶紧打电话给我们的朋友,将晚餐顺延至下下周周二。人还是应该现实一点。朋友们有点失望, 不过仍然盼望见到我们,况且花 12 天从 SF 到 LA 也不赖。 把不开心的事丢到一边,准备出发。两小时过后,我们才刚刚走出动物园。出了什么事?我们低头看了一下脚下的路: 天哪,这样走路也太慢了!有沙子、海水、阶梯、溪流,还有海边愤怒的海狮!这样我们只能按每小时2公里的速度前进,只有 我们预估一般的速度。要么我们现在每天走20小时,要么再把晚餐推迟一个星期。好吧,让我们各退一步:每天走12个小时,把晚餐安排到下下周的周末。只好 再打电话给朋友告诉他们这个情况。朋友们有些不高兴,但还是表示可以,到时候见。 在辛苦走了12小时后,我们准备在 Moss Beach 扎营休息。靠,要把帐篷在风中立起来根本不可能。直到半夜才开始休息。不过没什么大不了:明天在加快点速度就可以了。 第二天早上睡过头了,早上10点才醒,起来浑身酸痛精疲力尽。艹,今天没法走12个小时了,先走10个小时,明天可以走14个小时。收拾东西出发。 再缓慢行进了几个小时之后,我发现伙伴脚有点跛。妈的,是水泡。必须现在解决它,在这些问题开始减慢我们的速度前,必须 将它们扼杀在萌芽状态。我慢跑了45分钟到达内陆3英里远的Pescadero,买了一些创可贴再快速跑回去给朋友包扎了一下。我快累坏了,太阳也快下山 了,又浪费了一天的时间。到我们准备休息前今天只走了6英里。但是我们确实需要补充一下供给。一切都很好,明天我们就能赶上。 第二天醒来,扎紧脚上的绷带准备出发。转角之后突然发现,靠!这是个啥? 你妹的地图上怎么没标出它!现在我们只能往内陆走3英里,绕过这些被联邦政府用栅栏保护起来的区域,中途迷路了两次,在 中午前才好不容易又回到了海岸线。今天的时间过了一大半,而我们才前进了差不多1英里。好吧,不过我们不会再打电话给朋友推迟了,今天我们会一直走到午夜 试着赶上进度。 晚上在大雾里断断续续地睡了一夜。一大早被我的伙伴叫醒,他一阵阵的头疼,还有点发烧,我问他能不能坚持一下。“你在想 什么呢,混蛋,我已经连续三天在这么冷的雾中赶路,没有休息过了。“好吧,今天看来只能黄了,只能在原地好好恢复了。现在我们已经有经验了,今天好好休息 明天再走14个小时,还有几天的时间,我们一定能够做到! 第二天我们昏昏沉沉地起来了。我看了一眼随身的地图: 天啊!我们已经走了10天旅程里的第5天还没有离开海湾区域!太荒唐了!我们要重新估计一下准确的时间再打给朋友,搞不好会被骂,但至少得找一个现实一点的目标。 同伴说,我们在四天里走了40英里,这趟旅程至少又600英里,那就至少要60天,安全一点的说法说不定要70天,“没门…是,以前我是没走路从SF去过LA,但肯定不会要70天的时间,如果告诉他们我们要到复活节才能到,那要被他们笑死的“,我说。 我接着说,“如果你能保证每天走16个小时,我们就能把落下的时间补回来!我知道很困难,但现在是最关键的时刻,别抱怨了!”伙伴对我吼道 “一开始又不是我告诉别人下周日我们就能到的!因为你犯的这个错差点要我的命!” 两个人就这样不说话了。我还是没打出电话,等我的伙伴明天冷静一点我再决定,我也愿意做一些更合理的承诺。 第二天上午,我们一直待在各自的帐篷中直到一场暴风雨袭来。我们赶紧收拾好东西直到10点才摆脱危险。浑身酸痛,又长了好多新水泡。之前发生的事谁也没提,直到发现我那愚蠢的伙伴把水壶落下了,又被我指责了一顿,我们不得不再花30分钟回去取它。 我心里记得我们的厕纸已经快用完了,下次到一个小镇的时候应该囤一点。在我们又转个弯后,才发现一条湍急的河流挡住了去路,这时我突然感到肚子一阵难受…… 原文链接: Michael Wolfe   翻译: 伯乐在线 – 伯乐在线读者 译文链接: http://blog.jobbole.com/45756/

龙生   16 Aug 2013
View Details

微博短链接的生成算法

最近看到微博的短链接真是很火啊,新浪、腾讯、搜狐等微博网站都加入了短链接的功能。之所以要是使用短链接,主要是因为微博只允许发140 字,如 果链接地址太长的话,那么发送的字数将大大减少。短链接的主要职责就是把原始链接很长的地址压缩成只有6 个字母的短链接地址,当我们点击这6 个字母的 链接后,我们又可以跳转到原始链接地址。 开始以为短链接是按照某种算法把原始链接压缩为短链接,再根据算法从短链接反算成原始链接的。后来尝试了下压缩算法(gzip 压缩算法),发现对于url 这种字符串越是压缩,长度就越长。通过对压缩算法的一些了解,发现靠压缩算法来实现这个功能不太靠谱。 后来在网上找到一个生成算法,该算法主要使用MD5 算法对原始链接进行加密(这里使用的MD5 加密后的字符串长度为32 位),然后对加密后的 字符串进行处理以得到短链接的地址。原始的算法是C# 版本的,这里我把该算法修改成Java 版本的. 算法的具体代码如下,代码中有注释: 一、  代码 package com.csdn.shorturl; public class ShortUrlGenerator {   /** * @param args */ public static void main(String[] args) { // 长连接: http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml // 新浪解析后的短链接为: http://t.cn/h1jGSC String sLongUrl = "http://tech.sina.com.cn/i/2011-03-23/11285321288.shtml" ; // 3BD768E58042156E54626860E241E999 String[] aResult = shortUrl (sLongUrl); // 打印出结果 for ( int i = 0; i < aResult. length ; i++) { System. out .println( "[" + i + "]:::" + aResult[i]); } }   public static String[] shortUrl(String url) { // 可以自定义生成 MD5 加密字符传前的混合 KEY String key = "wuguowei" ; // 要使用生成 URL 的字符 String[] chars = new String[] { "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z" , "0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" , "E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" , "M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" , "U" , "V" , "W" , "X" , "Y" , "Z"   }; // 对传入网址进行 MD5 加密 String sMD5EncryptResult = ( new CMyEncrypt()).getMD5OfStr(key + url); String hex = sMD5EncryptResult;   String[] resUrl = new String[4]; for ( int i = 0; i < 4; i++) {   // 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算 String sTempSubString = hex.substring(i * 8, i * 8 + 8);   // 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用 long ,则会越界 long lHexLong = 0x3FFFFFFF & Long.parseLong (sTempSubString, 16); String outChars = "" ; for ( int j = 0; j < 6; j++) { // 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引 long index = 0x0000003D & lHexLong; // 把取得的字符相加 outChars += chars[( int ) index]; // 每次循环按位右移 5 位 lHexLong = lHexLong >> 5; } // 把字符串存入对应索引的输出数组 resUrl[i] = outChars; } return resUrl; } }     二、  输出结果 执行上面代码的结果如下,会产生4 组6 位字符串,任意一组都可以作为当前字符串的短链接地址。 [0]:::7nUFJn [1]:::f6Zzy2 [2]:::j6jmQb [3]:::2eAjea   三、  跳转原理 当我们生成短链接之后,只需要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系即可。当我们访问短链接时,只需要从映射关系中找到原始链接,即可跳转到原始链接。 转自:http://hi.baidu.com/lioliang/item/ddf10d1a733c575bf1090ecf

龙生   14 Aug 2013
View Details

Repeater控件使用(含删除,分页功能)

以SQL SERVER2000自带数据库Northwind中Customers表示例. 前台aspx代以码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Repeater.aspx.cs" Inherits="Repeater" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server">     <title>Repeater控件使用</title>     <script language="javascript" type="text/javascript">     function Check(parentChk,ChildId)     {         var oElements = document.getElementsByTagName("INPUT");         var bIsChecked = parentChk.checked;        for(i=0; i<oElements.length;i++)         {             if( IsCheckBox(oElements[i]) &&                 IsMatch(oElements[i].id, ChildId))             {                 oElements[i].checked = bIsChecked;             }         }      }     function IsMatch(id, ChildId)     {         var sPattern =’^Repeater1.*’+ChildId+’$';         var oRegExp = new RegExp(sPattern);         if(oRegExp.exec(id))             return true;         else             return false;     }     function IsCheckBox(chk)     {         if(chk.type == 'checkbox') return true;         else return false;     }     </script> </head> <body>     <form id="form1" runat="server">     <div style="margin-bottom:20px;text-align:center; width:1006px;">Repeater控件使用</div> <asp:Repeater ID="Repeater1" runat="server">     <%--SeparatorTemplate描述一个介于每条记录之间的分隔符--%>     <%--<SeparatorTemplate>         <tr>         <td colspan="5"><hr /></td>         </tr>     </SeparatorTemplate>--%>     <HeaderTemplate>       <table border="1" cellpadding="0" cellspacing="0" style="width:1006px;border-collapse:collapse; text-align:center;">       <tr>         <td style="background-color:#cccccc; font-weight:bold; height:25px;"><input id="chkAll" name="chkAll" runat="server" type="checkbox" onclick="Check(this,’chkItem')" title="全选" />全</td>         <td style="background-color:#cccccc; font-weight:bold; height:25px;">View</td>         <td style="background-color:#cccccc; font-weight:bold; height:25px;">CustomerID</td>         <td style="background-color:#cccccc; font-weight:bold;">CompanyName</td>         <td style="background-color:#cccccc; font-weight:bold;">ContactName</td>         <td style="background-color:#cccccc; font-weight:bold;">ContactTitle</td>         <td style="background-color:#cccccc; font-weight:bold;">Address</td>       </tr>     </HeaderTemplate>     <ItemTemplate>       <tr>         <td><asp:CheckBox ID="chkItem" runat="server" /></td>         <td><a href='<%# "View.aspx?id="+DataBinder.Eval(Container.DataItem, "CustomerID") %>' target="_blank">View</a></td>         <td><asp:Label ID="lblID" Text='<%# DataBinder.Eval(Container.DataItem, "CustomerID")%>' runat="server"></asp:Label></td>         <td><%# DataBinder.Eval(Container.DataItem, "CompanyName")%></td>         <td><%# DataBinder.Eval(Container.DataItem, "ContactName")%></td>         <td><%# DataBinder.Eval(Container.DataItem, "ContactTitle")%></td>         <td><%# DataBinder.Eval(Container.DataItem, "Address")%></td>       </tr>     </ItemTemplate>     <%--AlternatingItemTemplate描述交替输出行的另一种外观--%>     <AlternatingItemTemplate>       <tr bgcolor="#e8e8e8">         <td><asp:CheckBox ID="chkItem" runat="server" /></td>         <td><a href='<%# "View.aspx?id="+DataBinder.Eval(Container.DataItem, "CustomerID") %>' target="_blank">View</a></td>         <td><asp:Label ID="lblID" Text='<%# DataBinder.Eval(Container.DataItem, "CustomerID")%>' runat="server"></asp:Label></td>         <td><%# DataBinder.Eval(Container.DataItem, "CompanyName")%></td>         <td><%# DataBinder.Eval(Container.DataItem, "ContactName")%></td>         <td><%# DataBinder.Eval(Container.DataItem, "ContactTitle")%></td>         <td><%# DataBinder.Eval(Container.DataItem, "Address")%></td>       </tr>     </AlternatingItemTemplate>     <FooterTemplate>      </table>     </FooterTemplate> </asp:Repeater> <div style="background-color:#dedede; width:1006px;"> […]

龙生   14 Aug 2013
View Details

SQL Server存储过程Return、output参数及使用技巧

SQL Server目前正日益成为WindowNT操作系统上面最为重要的一种数据库管理系统,随着 SQL Server2000的推出,微软的这种数据库服务系统真正地实现了在WindowsNT/2000系列操作系统一统天下的局面,在微软的操作系统上,没有任何一种数据库系统能与之抗衡,包括数据库领域中的领头羊甲骨文公司的看家数据库Oracle在内。不可否认,SQL Server最大的缺陷就是只能运行在微软自己的操作系统上,这一点是SQL Server的致命点。但在另一方面却也成了最好的促进剂,促使SQL Server在自己仅有的“土地”上面将自己的功能发挥到了极至最大限度的利用了NT系列操作系统的各种潜能!作为SQL Server数据库系统中很重要的一个概念就是存储过程,合理的使用存储过程,可以有效的提高程序的性能;并且将商业逻辑封装在数据库系统中的存储过程中,可以大大提高整个软件系统的可维护性,当你的商业逻辑发生改变的时候,不再需要修改并编译客户端应用程序以及重新分发他们到为数众多的用户手中,你只需要修改位于服务器端的实现相应商业逻辑的存储过程即可。合理的编写自己需要的存储过程,可以最大限度的利用SQL Server的各种资源。下面我们来看看各种编写SQL Server存储过程和使用存储过程的技巧经验。 Input 此参数只用于将信息从应用程序传输到存储过程。 InputOutput 此参数可将信息从应用程序传输到存储过程,并将信息从存储过程传输回应用程序。 Output 此参数只用于将信息从存储过程传输回应用程序。 ReturnValue 此参数表示存储过程的返回值。SQL Server 的存储过程参数列表中不显示该参数。它只与存储过程的 RETURN 语句中的值相关联。   存储过程为主键生成新值后,通常使用存储过程中的 RETURN 语句返回该值,因此用来访问该值的参数类型是 ReturnValue 参数。 1、不带输入参数的简单存储过程 if object_id('up_user') is not null drop proc up_user go create proc up_user as set nocount on delcare @name varchar(10) begin select @name=uname from user end set nocount off go esec up_user 2、带输入参数的简单存储过程  if object_id('up_user') is not null drop proc up_user go create proc up_user @id int as set nocount on delcare @name varchar(10) begin select @name=uname from user where  uid=@id end set nocount off go --执行该存储过程 esec up_user 1 3、带Return参数的存储过程  if […]

龙生   14 Aug 2013
View Details

ROW_NUMBER() OVER函数的基本用法用法

语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN) 简单的说row_number()从1开始,为每一条分组记录返回一个数字,这里的ROW_NUMBER() OVER (ORDER BY xlh DESC) 是先把xlh列降序,再为降序以后的没条xlh记录返回一个序号。 示例: xlh           row_num 1700              1 1500              2 1085              3 710                4 row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的) 实例: 初始化数据 create table employee (empid int ,deptid int ,salary decimal(10,2)) insert into employee values(1,10,5500.00) insert into employee values(2,10,4500.00) insert into employee values(3,20,1900.00) insert into employee values(4,20,4800.00) insert into employee values(5,40,6500.00) insert into employee values(6,40,14500.00) insert into employee values(7,40,44500.00) insert into employee values(8,50,6500.00) insert into employee values(9,50,7500.00) 数据显示为 empid       deptid      salary ———-- ———-- ————————————— […]

龙生   12 Aug 2013
View Details

存储过程中执行动态Sql语句

MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有。还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码。EXEC在某些情况下会更灵活。除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql. 1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储过程,另一种是执行一个动态的批处理。以下所讲的都是第二种用法。 下面先使用EXEC演示一个例子,代码1   代码 DECLARE @TableName VARCHAR(50),@Sql NVARCHAR (MAX),@OrderID INT; SET @TableName = 'Orders'; SET @OrderID = 10251; SET @sql =      ’SELECT * FROM '+QUOTENAME(@TableName) +’WHERE OrderID = '+      CAST(@OrderID AS VARCHAR(10))+' ORDER BY ORDERID DESC' EXEC(@sql);   注:这里的EXEC括号中只允许包含一个字符串变量,但是可以串联多个变量,如果我们这样写EXEC: EXEC('SELECT TOP('+ CAST(@TopCount AS VARCHAR(10)) +')* FROM '+            QUOTENAME(@TableName) +' ORDER BY ORDERID DESC');   SQL编译器就会报错,编译不通过,而如果我们这样:

  编译器就会通过; 所以最佳的做法是把代码构造到一个变量中,然后再把该变量作为EXEC命令的输入参数,这样就不会受限制了。 EXEC的缺点是不提供接口,这里的接口是指,它不能执行一个包含一个带变量符的批处理,如下 代码 DECLARE @TableName VARCHAR(50),@Sql NVARCHAR(MAX),@OrderID INT; SET @TableName = 'Orders'; SET @OrderID = 10251; SET @sql = 'SELECT * FROM '+QUOTENAME(@TableName) +      ’WHERE OrderID = @OrderID […]

龙生   12 Aug 2013
View Details

SQL Server 存储过程

Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。 存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。 由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。   1、 存储过程的优点 A、 存储过程允许标准组件式编程 存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。 B、 存储过程能够实现较快的执行速度 如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。 C、 存储过程减轻网络流量 对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。 D、 存储过程可被作为一种安全机制来充分利用 系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。   Ø 系统存储过程 系统存储过程是系统创建的存储过程,目的在于能够方便的从系统表中查询信息或完成与更新数据库表相关的管理任务或其他的系统管理任务。系统存储过程主要存储在master数据库中,以“sp”下划线开头的存储过程。尽管这些系统存储过程在master数据库中,但我们在其他数据库还是可以调用系统存储过程。有一些系统存储过程会在创建新的数据库的时候被自动创建在当前数据库中。 常用系统存储过程有:

系统存储过程示例:

  Ø 用户自定义存储过程 1、 创建语法

  2、 创建不带参数存储过程

3、 修改存储过程

4、 带参存储过程

5、 带通配符参数存储过程

6、 带输出参数存储过程

7、 不缓存存储过程

8、 加密存储过程

9、 带游标参数存储过程

10、 分页存储过程

Ø Raiserror Raiserror返回用户定义的错误信息,可以指定严重级别,设置系统变量记录所发生的错误。 语法如下:

# msg_id:在sysmessages系统表中指定的用户定义错误信息 # msg_str:用户定义的信息,信息最大长度在2047个字符。 # severity:用户定义与该消息关联的严重级别。当使用msg_id引发使用sp_addmessage创建的用户定义消息时,raiserror上指定严重性将覆盖sp_addmessage中定义的严重性。 任何用户可以指定0-18直接的严重级别。只有sysadmin固定服务器角色常用或具有alter trace权限的用户才能指定19-25直接的严重级别。19-25之间的安全级别需要使用with log选项。 # state:介于1至127直接的任何整数。State默认值是1。

龙生   12 Aug 2013
View Details
1 238 239 240 280