加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver 2005新功能

发布时间:2020-12-12 14:21:49 所属栏目:MsSql教程 来源:网络整理
导读:2005 ??? Top N ? declare @n int set @n = 8 select top ( @n ) * from tablename ? ??? 分页 1 select * from ( 2 select OrderId,Freight,ROW_NUMBER() OVER ( order by Freight) as row from Orders 3 ) a 4 where row between 20 and 30 ? ??? 排名 1 s

2005

??? Top N

?

declare @n int
set @n=8
select top(@n) * from tablename

?

??? 分页

1 select * from(  
2     select OrderId,Freight,ROW_NUMBER() OVER(order by Freight) as row from Orders  
3 ) a  
4 where row between 20 and 30

?

??? 排名

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

?

?

??? try ... catch?

?

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

?

?

??? 公用表表达式

?

 1 WITH ProductCTE([CategoryID],[ProductsCount])
 2 
 3 AS
 4 
 5 (
 6 
 7     SELECT [CategoryID],COUNT(1)
 8 
 9     FROM [dbo].[Product]
10 
11     GROUP BY [CategoryID]
12 
13 )
14 
15  
16 
17 SELECT c.[CategoryID],c.[CategoryName],cte.[ProductsCount]
18 
19 FROM [dbo].[Category] c
20 
21 INNER JOIN ProductCTE cte
22 
23     ON c.[CategoryID] = cte.[CategoryID]
24 
25 ORDER BY cte.[ProductsCount]
26 
27 --关联CTE
28 
29 WITH CategoryCTE
30 AS
31 (
32     SELECT * FROM [dbo].[Category]
33 ),ProductCTE
34 AS
35 (
36     SELECT p.*,cte.[CategoryName] FROM [dbo].[Product] p
37     INNER JOIN CategoryCTE cte
38         ON p.[CategoryID] = cte.[CategoryID]
39 )
40  
41 SELECT * FROM ProductCTE
42 ---------------------------------------------------------------------------递归CTE:递归公用表表达式是在CTE内的语句中调用其自身的CTE。
43 
44 WITH cte([CategoryID],[CategoryName],[ParentID],[Level])
45 AS
46 (
47     -- 查询语句
48     SELECT [CategoryID],1 AS [Level] FROM [dbo].[Category]
49     WHERE [ParentID] IS NULL
50     UNION ALL
51     -- 递归语句
52     SELECT c.[CategoryID],c.[ParentID],cte.[Level] + 1
53     FROM [dbo].[Category] c
54     INNER JOIN cte
55         ON c.[CategoryID] = cte.[ParentID]
56 )
57  
58 SELECT [CategoryID],[Level] FROM cte
59  

?

限制递归层次、Where过滤递归结果数据层次

? ? 参考:https://www.cnblogs.com/libingql/p/4461715.html

?一段展BOM的代码,以微软示例数据库AdventureWorks的 Production.BillOfMaterials表为例,在计算用量的时候,要用数据转换,否则会出现“定位点类型和递归部分的类型不匹配”的问题。
;with bom as
(
    select b.ProductAssemblyID,b.ComponentID,b.BOMLevel,b.PerAssemblyQty,cast(b.PerAssemblyQty as decimal(10,6)) qty,ROW_NUMBER() over(order by getdate()) od
        from Production.BillOfMaterials b where b.ComponentID=767
    union all
    select b.ProductAssemblyID,cast(b.PerAssemblyQty*bom.qty as decimal(10,6)),ROW_NUMBER() over(order by getdate())+ bom.od*100
        from Production.BillOfMaterials b join bom on b.ProductAssemblyID=bom.ComponentID
)
select p.ProductNumber 物料编码,replicate(..,bom.bomlevel)+ p.Name 物料名称,bom.BOMLevel 层级,bom.PerAssemblyQty BOM用量,bom.qty 累计用量,bom.od 排序 from bom join Production.Product p on bom.ComponentID=p.ProductID
order by rtrim(od)

?



??? 直接发布Web Service

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

 1    --DataSet CustOrdersOrders(string customerID)  
 2 CREATE ENDPOINT Orders_Endpoint  
 3 state=started  
 4 as http(  
 5     path=/sql/orders, 6     AUTHENTICATION=(INTEGRATED), 7     ports=(clear)  
 8 )  
 9 for soap(  
10     WebMethod CustOrdersOrders(    
11         name=Northwind.dbo.CustOrdersOrders  
12     ),13      
14     wsdl=default,15     database=Northwind,16     namespace=http://mysite.org/  
17 )

?

??? 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等多种验证,你需要编写不同的验证代码。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读