1. TOP 表达式
SQL Server 2000的TOP是个固定值,是不是觉得不爽,现在改进了。 

 

--前n名的订单
declare
 @n int 
set @n = 10 
select TOP(@n* from Orders

 


2. 分页

不知各位过去用SQL Server 2000是怎么分页的,大多都用到了临时表。SQL Server 2005一句话就支持分页,性能据说也非常不错。

 

 

--按Freight从小到大排序,求20到30行的结果 
select * from
    
select OrderId, Freight, ROW_NUMBER() OVER(order by Freight) as row from Orders 
) a 
where row between 20 and 30

 


3. 排名

 

select * from
    
select OrderId, Freight, RANK() OVER(order by Freight) as rank from Orders 
) a 
where rank between 20 and 30

 


4. try ... catch

SQL Server 2000没有异常,T-SQL必须逐行检查错误代码,对于习惯了try catch程序员,2005是不是更加亲切:

 

 

SET XACT_ABORT ON  -- 打开 try功能 
BEGIN TRY 
    
begin tran 
        
insert into Orders(CustomerId) values(-1
    
commit tran 
    
print 'commited' 
END TRY 
BEGIN
 CATCH 
    
rollback    
    
print 'rolled back' 
END CATCH

 


5. 通用表达式CTE

通过表达式可免除你过去创建临时表的麻烦。

 

 

--例子:结合通用表达式进行分页
WITH OrderFreight AS
    
select OrderId, Freight, ROW_NUMBER() OVER(order by Freight) as row from Orders 

select OrderId, Freight from OrderFreight where row between 10 and 20

 

特别,通过表达式还支持递归。


6. 直接发布Web Service

想要把store procedure变成Web Service就用这个吧,.NET, IIS都不需要,通过Windows 2003的HTTP Protocol Stack直接发布WebService,用这个功能需要Windows 2003 sp1

 

--DataSet CustOrdersOrders(string customerID) 
CREATE ENDPOINT Orders_Endpoint 
state
=started 
as http( 
    path
='/sql/orders'
    AUTHENTICATION
=(INTEGRATED), 
    ports
=(clear) 

for soap( 
    WebMethod 
'CustOrdersOrders'(   
        name
='Northwind.dbo.CustOrdersOrders' 
    ), 
    
    wsdl
=default
    
database='Northwind'
    namespace
='http://mysite.org/' 
)

 

Web Service就发布好了,敲入http://localhost/sql/orders?wsdl得到wsdl

在http通讯时,例子代码使用的是Windows集成验证 。
给个客户端例子。
private void button1_Click(object sender, EventArgs e)
{
    localhost.Orders_Endpoint endp 
= new localhost.Orders_Endpoint();
    endp.Credentials 
= System.Net.CredentialCache.DefaultCredentials;
    
object[] r = endp.CustOrdersOrders("VINET");

    DataSet ds 
= new DataSet();
    
foreach(object o in r)
        
if (o is DataSet) ds = (DataSet)o;

    dataGridView1.DataSource 
= ds.Tables[0];            
}

SQL Server 2005支持basic, digest, sql auth等多种验证,你需要编写不同的验证代码。 

 

转载自:http://blog.csdn.net/jimmyxing/archive/2007/09/15/1786749.aspx

posted @ 2008-09-28 10:20 jectZhou 阅读(14) | 评论 (0)编辑

今天看到别人的问题,在此留下笔记以备以后遇到。

表T结构

A      B

a1    10

a2    10

a3    10

要求:查询后得出如下结果:

A      B

a1    10

a2    20

a3    30

实现:

1、sql2005实现:使用了sql2005自带函数RANK()   这里注意:由于B字段值相同不能使用B字段进行RANK,否则结果是序号列的值都会为1,从而导致计算查询结果失败;还有一点需要注意的是被rank的字段不能有相同值,否则将会出现两个相同的序号。如果抛开以上问题,则可以使用ROW_NUMBER()函数替换RANK(),作用是生成唯一行号,这个看起来好像更合理一点 ^ ^。   在此特别感谢  @沈啣结  的提醒。

    下面假定A字段无重复值:

1、SELECT A,B*sNO as B FROM (SELECT RANK() OVER (ORDER BY A DESC) AS sNO,
         A,B
FROM T) n

2、SELECT A,B*sNO as B FROM (SELECT ROW_NUMBER() OVER (ORDER BY (被查询的任意列)DESC) AS sNO,
         A,B
FROM T) n

2、sql2000实现: 修改原因和sql2005实现一样

SELECT A,B*sNO as B FROM (SELECT TOP 100 sNO= (SELECT COUNT(*) FROM T AS A
                    WHERE A.A<= B.A),
       A,B
FROM T AS B ORDER BY 1) n

 

说明:先通过内部查询动态增加表列名:sNO,然后再通过外层查询进行具体的计算!

以上两种实现方式相同,这只是一种思路,应该还有其他实现方法,望指出!不胜感谢!!

posted @ 2008-09-27 15:45 jectZhou 阅读(99) | 评论 (5)编辑

从命令行也可以运行 WinRAR 命令,常规的命令行语法描述如下:

WinRAR <命令> -<开关1> -<开关N> <压缩文件> <文件...> <@列表文件...> <解压路径\>

命令 要 WinRAR 运行的字符组合代表功能
开关 切换操作指定类型,压缩强度,压缩文件类型,等等的定义。
压缩文件 要处理的压缩文件名。
文件 要处理的文件名。
列表文件 列表文件是包含要处理文件名称的纯文本。文件名应该在第一卷启动。可以在列表文件中使用//字符后添加注释。例如,你可以包含两列字符串创建 backup.lst:c:\work\doc\*.txt //备份文本文档 c:\work\image\*.bmp //备份图片c:\work\misc并接着运行: winrar a backup @backup.lst你可以在命令行中同时指定普通的文件名和列表文件名。
解压路径 只与命令 e 和 x ,搭配使用。指出解压文件添加的位置。如果文件夹不存在时,会自动创建。
注意事项
a) 如果未指定 文件 或是 列表文件 时,WinRAR 将会以缺省的 *.* 运行全部的文件;
b) 如果未指定压缩文件扩展名时,WinRAR 将会使用在 压缩配置 中选定的默认压缩文件格式。但你可以指定 .RAR 或 .ZIP 扩展名来替换它们;
c) 在命令行所输入的开关会替换相同的配置设置值;
d) 在命令 c、e、s、t、rr、k 和 x 可在压缩文件名中使用通配符。如此可以用单个的命令来进行超过一个以上的压缩文件,除此之外,如果你指定 -r 开关于这些命令时,它们将会搜索在子文件夹中的压缩文件;

e) 某些命令和开关只应用在 RAR 压缩文件,有些则在 RAR 和 ZIP 都可使用,而某些则可应用在全部的压缩文件格式。这一些都得看压缩文件格式所提供的特性而定;
f) 命令和开关的大小写是相同意思的,你可以用大写或者小写来下命令均可。

来源:http://www.cnblogs.com/mossan/archive/2007/04/19/719926.html   #7

posted @ 2008-09-16 13:28 jectZhou 阅读(10) | 评论 (0)编辑

又一篇笔记,以备后用!!

     需求:

有表tb,表有两个字段,分别为:id,value。

表中存有数据如下:id        value

                         1         a

                         1         a1

                         1         a2

                         2         b

                         2         b1

                         3         c1

                         3         c2

     需要通过查询实现:1         a,a1,a2

                              2         b,b1

                              3         c1,c2

实现方法:

          1、sql2000 使用合并函数:

          create function f_tb(@id int)
returns varchar(8000)
as
begin
 
declare @str varchar(8000)
 
set @str = ''
 
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
 
set @str = right(@str , len(@str) - 1)
 
return(@str)
End
go

--调用自定义函数得到结果:
select distinct id ,dbo.f_tb(id) as value from t

          2、sql2005 处理方式如下:

SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
       
SELECT [values]= STUFF(REPLACE(REPLACE(
            (
               
SELECT value FROM tb N
               
WHERE id = A.id
               
FOR XML AUTO
            ),
'<N value="', ','), '"/>', ''), 1, 1, '')
)N

参考: http://topic.csdn.net/u/20080410/15/88f6491b-d9fe-4bd1-a350-22b4d5c9d415.html    #3

 

 

                                                                                                       2008-09-05  (笔记)

posted @ 2008-09-05 13:47 jectZhou 阅读(138) | 评论 (0)编辑

唉!真是TM笨啊!

花了一上午的时间,就弄出来这么个东西,在此留下笔记,以备后用!

    也请牛人们提供更好的方法!在此表示感谢!

问题!通过存储过程删除满足条件的记录(多个条件,多个表)

1、使用存储过程(不能实现的)

     ALTER PROC [dbo].[PD_Del]
     @WHEREA varchar(100),
     @WHEREB sysname

     as

    DELETE FROM A WHERE A IN (WHEREA) AND B=@WHEREB 

    DELETE FROM B WHERE A IN (WHEREA) AND B=@WHEREB 

 

执行(传入参数):EXEC PD_Del 'N','a,b,c'     需要实现:删除表中列A等于a,b,c并且B等于N等记录,同时删除关联表中与之相关的记录。

SQL输出:

(0 行受影响)

(0 行受影响)

原因:传入给存储过程的第二个参数是'a,b,c',SQL会将其识别为一个值,执行虽然通过了,但是违背了需要的实现,当然程序(C#)传值时也会引发异常。

2、使用存储过程(正确)

    ALTER PROC [dbo].[PD_Del]
     @WHEREA varchar(100),
     @WHEREB sysname

     as

    DECLARE @sql varchar(1000)
    SET @sql=''
    SELECT @sql='DELETE A
    WHERE A IN ('+@WHEREA+') AND B='''+@WHEREB+'''
    DELETE B
    WHERE A IN ('+@WHEREA+') AND B='''+@WHEREB+''''
    EXEC (@sql)

参考:http://zhidao.baidu.com/question/47566448.html?fr=qrl

    执行(传入参数):EXEC PD_Del 'N','a,b,c'    

SQL 输出:

消息 207,级别 16,状态 1,第 2 行
列名 'c' 无效。
消息 207,级别 16,状态 1,第 2 行
列名 'b' 无效。
消息 207,级别 16,状态 1,第 2 行
列名 'a' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'c' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'b' 无效。
消息 207,级别 16,状态 1,第 4 行
列名 'a' 无效。

原因:使用过程中使用了字符串拼接,来动态构建输入条件,SQL将第二个传入的参数其作为表列名处理,最终导致报错。

     执行(传入参数):EXEC PD_Del 'N','''a'',''b'',''c'''

执行成功。第二个参数传入了一个字符串,在删除条件中起到了作用,最终传入的值为:in('a','b','c')。则正确!。(注:sql中输出单引号使用:''  ,要想输出单个' 则需要:SELECT '''' ,要想输出'a',则需要:select '''a''',要想输出'a','b',则需要:select '''a'',''b''',可见,最外层一对单引号表示需要输出的是字符串)。     使用程序传入值时,需要拼接成跟第二个参数一样的字符串传入才会执行正确。

                                                                                                  --2008-08-28(笔记)

 

 

 

 

posted @ 2008-08-28 14:53 jectZhou 阅读(98) | 评论 (0)编辑
posted @ 2008-05-16 15:43 jectZhou 阅读(43) | 评论 (2)编辑
这个对于我来说是新东西。呵呵!
上面的东西,感觉蛮酷的!!
也不知道与JQUERY比起来那个更优秀点。因为我是一个半懂不懂的新手。
http ://www.extjs.com
上面有相关的例子演示,真得不错噢!!
posted @ 2008-05-10 17:13 jectZhou 阅读(33) | 评论 (0)编辑