新建存儲過程
數據庫名-->可編程性-->存儲過程-->右擊編寫存儲過程腳本爲drop和create到新建查詢編輯器窗口
可參考:http://www.cnblogs.com/oneivan/archive/2012/01/13/2321254.html
CREATE PROCEDURE[dbo].[procedureName ]
---此處爲默認參數,爲外面傳遞過來的參數值
@Date datetime as
begin
---此處參數是過程中可能會使用到的參數
declare @Timedatetime;
set @Time= ‘2015-07-02’;
---select沒有set效率高,沒有涉及到表操作時,用set設值
end;
調試存儲過程
對於單個變量-->print @sth對於整個表select*from tableName
保存存儲過程
撤銷註釋掉的代碼運行下存儲過程,成功則可在刷新後的存儲過程目錄下找到
調用存儲過程
不用exec調用存儲過程
create table()..
go --go表示要開始下一個事務了
procName --這裏直接使用存儲過程名字就是調用了
一定要使用exec調用存儲過程
create table()
exec procName--不是作爲這個事務的第一句開始的所以要帶上exec
無參數
exec procName
有輸出參數
exec procName參數,參數output
(參考 http://zhidao.baidu.com/question/171306193.html)
創建遊標
聲明一個遊標,查詢滿足條件的數據
declare @A varchar(32)
declare CursorName cursor for
select A from tableName where sth--查詢條件
打開遊標
open CursorName;
fetch next
from
CursorName
into
@A --聲明變量,用於讀取遊標中的值declare@sthint
循環讀取
while @@FETCH_STATUS<> -1
begin
此處寫入sql語句
fetch next
from
CursorName
into
@A
end;
關閉遊標
close customerCursor;
刪除遊標
deallocate customerCursor;
創建臨時表
一次性插入全部內容,每次輸入的值一一對應
OBJECT_ID就是根據對象名稱返回該對象的id,能夠判斷是否創建了臨時表,#temptable爲臨時表的名稱
if OBJECT_ID('tempdb..#temptable')isnotnull
臨時表存在,刪除臨時表
drop table#temptable
創建臨時表
create table#temptable(Aint,Bvarchar(30),Cnumeric(12,2),Dnumeric(12,2),Enumeric(12,2))
插入臨時表
insert into#temptable values(@1,@2,@3,@4,@5+@6)
--- 將臨時表數據導入到數據庫中某表中
insert into tableName(element1,element2,element3,element4,element5)
select
排名,根據p.D排序,若p.D同則依據p.E排
ROW_NUMBER()OVER(orderbyp.Ddesc,p.Edesc)asranking,
如果p.A爲空則p.A值設爲0
isnull(p.A,0),
p.B,
p.C,
p.D
from #temptablep
order byranking
if OBJECT_ID('tempdb..#temptable')isnotnull
drop table#temptable
分多步插入臨時表中的值
插入AB值
insert #temptable(A,B)
select
關鍵詞distinct用於返回唯一不同的值
distinct
A1.D,
A2.ID
from
table1 A1, table2A2
where sth
插入C值
update #temptable
set C=(
select isnull(sum(P.CloseIncome-P.OpenCost-P.OpenCharge-P.CloseCharge), 0)
from HistoryPositionP
where #temptable.CustomerID=P.CustomerID
and P.PositionTime>=@startTime
and P.PositionTime<@endTime
and P.ModifyState= 1
)
日期、時間、星期
初始日期
declare @Timedatetime;
declare @weekDayint;
declare @hour int
declare @TradeDate date,
日期所在的週一日期
declare @mondayDatedatetime;
日期當前的小時數
select @hour=datepart(HOUR,@Date)--獲取小時數
獲取yyyy-MM-dd
將變量設置成date即可
去掉時分秒
保留日期12am爲:00:00
set @Date= convert(char(10),@Date,20);
日期加上個小時
set @Time= dateadd(hh, 1,convert(char(10),@Date, 120));
--返回~7,以此表示星期日、星期一...星期六
set @weekDay= datepart(weekday,@Date);
----判斷是否爲週日
if(@weekDay=1)
begin
set @weekDay= @weekDay+ 7;
end;
set @mondayDate= dateadd(day, 2-@weekDay,@Date);--獲取@Date所在的週一
若@mondayDate=dateadd(day,2-datepart(weekday,@Date))當@Date爲週日時,@mondayDate爲@Date的後一天,出錯
nolock不加鎖
若此選項被選中時,SQL Server 在讀取或修改數據時不加任何鎖。 在這種情況下,用戶有可能讀取到未完成事務(Uncommited Transaction)或回滾(Roll Back)中的數據, 即所謂的“髒數據”。
select * from table1 c with(nolock),table2 m with(nolock) where c.MediacyID=m.ID
and (
c.MemberID = @memberID or
c.MemberID in (select ID from Member with(nolock) where ParentMemberID = @memberID)
)