查詢Sqlserver數據庫逝世鎖的一個存儲進程分享。本站提示廣大學習愛好者:(查詢Sqlserver數據庫逝世鎖的一個存儲進程分享)文章只能為提供參考,不一定能成為您想要的結果。以下是查詢Sqlserver數據庫逝世鎖的一個存儲進程分享正文
☆ 獲得數據庫一切表名,表的一切列名
select name from sysobjects where xtype='u'
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
☆ 遞歸查詢數據
Sql語句裡的遞歸查詢 SqlServer2005和Oracle 兩個版本
之前應用Oracle,認為它的遞歸查詢很好用,就研討了一下SqlServer,發明它也支撐在Sql裡遞歸查詢
舉例解釋:
SqlServer2005版本的Sql以下:
好比一個表,有id和pId字段,id是主鍵,pid表現它的下級節點,表構造和數據:
CREATE TABLE [aaa](
[id] [int] NULL,
[pid] [int] NULL,
[name] [nchar](10)
)
GO
INSERT INTO aaa VALUES(1,0,'a')
INSERT INTO aaa VALUES(2,0,'b')
INSERT INTO aaa VALUES(3,1,'c')
INSERT INTO aaa VALUES(4,1,'d')
INSERT INTO aaa VALUES(5,2,'e')
INSERT INTO aaa VALUES(6,3,'f')
INSERT INTO aaa VALUES(7,3,'g')
INSERT INTO aaa VALUES(8,4,'h')
GO
--上面的Sql是查詢出1結點的一切子結點
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
select * from my1 --成果包括1這筆記錄,假如不想包括,可以在最初加上:where id <> 1
--上面的Sql是查詢出8結點的一切父結點
with my1 as(select * from aaa where id = 8
union all select aaa.* from my1, aaa where my1.pid = aaa.id
)
select * from my1;
--上面是遞歸刪除1結點和一切子結點的語句:
with my1 as(select * from aaa where id = 1
union all select aaa.* from my1, aaa where my1.id = aaa.pid
)
delete from aaa where exists (select id from my1 where my1.id = aaa.id)
Oracle版本的Sql以下:
好比一個表,有id和pId字段,id是主鍵,pid表現它的下級節點,表構造和數據請參考SqlServer2005的,Sql以下:
--上面的Sql是查詢出1結點的一切子結點
SELECT * FROM aaa
START WITH id = 1
CONNECT BY pid = PRIOR id
--上面的Sql是查詢出8結點的一切父結點
SELECT * FROM aaa
START WITH id = 8
CONNECT BY PRIOR pid = id
明天幫他人做了一個有點意思的sql,也是用遞歸完成,詳細以下:
假定有個發賣表以下:
CREATE TABLE [tb](
[qj] [int] NULL, -- 月份,本測試假定從1月份開端,而且數據都是持續的月份,中央沒有隔絕
[je] [int] NULL, -- 本月發賣現實金額
[rwe] [int] NULL, -- 本月發賣義務額
[fld] [float] NULL -- 本月金額年夜於義務額時的返利點,返利額為je*fld
) ON [PRIMARY]
如今請求盤算每一個月的返利金額,規矩以下:
1月份發賣金額年夜於義務額 返利額=金額*返利點
2月份發賣金額年夜於義務額 返利額=(金額-1月份返利額)*返利點
3月份發賣金額年夜於義務額 返利額=(金額-1,2月份返利額)*返利點
今後月份順次類推,發賣額小於義務額時,返利為0
詳細的Sql以下:
WITH my1 AS (
SELECT *,
CASE
WHEN je > rwe THEN (je * fld)
ELSE 0
END fle,
CAST(0 AS FLOAT) tmp
FROM tb
WHERE qj = 1
UNION ALL
SELECT tb.*,
CASE
WHEN tb.je > tb.rwe THEN (tb.je - my1.fle -my1.tmp)
* tb.fld
ELSE 0
END fle,
my1.fle + my1.tmp tmp -- 用於累加後面月份的返利
FROM my1,
tb
WHERE tb.qj = my1.qj + 1
)
SELECT *
FROM my1
SQLserver2008應用表達式遞歸查詢
--由父項遞歸上級
with cte(id,parentid,text)
as
(--父項
select id,parentid,text from treeview where parentid = 450
union all
--遞歸成果集中的上級
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.parentid = c.id
)
select id,parentid,text from cte
---------------------
--由子級遞歸父項
with cte(id,parentid,text)
as
(--上級父項
select id,parentid,text from treeview where id = 450
union all
--遞歸成果集中的父項
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.id = c.parentid
)
select id,parentid,text from cte