sqlserver 臨時表 遊標 儲存過程拼sql 日期函式等

lanchengxiaoxiao發表於2012-04-24

1、

建立臨時表
       方法一:
     create table #臨時表名(欄位1 約束條件,
                      欄位2 約束條件,
                  .....)
        create table ##臨時表名(欄位1 約束條件,
                          欄位2 約束條件,
                      .....)
        方法二:
     select * into #臨時表名 from 你的表;
       select * into ##臨時表名 from 你的表;
注:以上的#代表區域性臨時表,##代表全域性臨時表

例如:create table #tblRefundPaperPassengerNames
  (
   refundApplicationId int ,
   passengerNames varchar(500)
  )


查詢臨時表
     select * from #臨時表名;
       select * from ##臨時表名;

刪除臨時表
     drop table #臨時表名;
       drop table ##臨時表名;

 

2、遊標的定義及使用

declare @curName cursor;

declare @Name int;//定義遊標就得定義一個盛放遊標內容的容器,資料型別相同

set @curName =Cursor for select X from #table

open @curName

Fetch Next from  @curName  Into @Name

While @@fetch_status =0

begin

  ************;

  Fetch Next from @curName Into @Name

end

Close @curName ;

Deallocate @curName ;

 

 

3、

儲存過程裡判斷一個引數和一個欄位的關係時 必須select語句得有括號,例如

     IF @Price<= (SELECT MIN(MarkupPrice) FROM IOrderPriceList)   


4.在儲存過程裡,動態的拼sql語句,除了想要返回子結果集,有的時候還需要一些對原結果集的sum,cout之類的
然後賦給out引數 ,傳出該值   

declare @sql nvarchar(4000);
declare @SumOperateFee money;
set @sql=' select * from orders where reservationtime > ''2009-7-22'''--簡易的sql ,實際中複雜很多
set @sql='select @SumOperateFee=sum(a.pricedue) from ( '+@sql+' ) as a '

EXECUTE sp_executesql
 @sql,
 N'@SumOperateFee money output',
 @SumOperateFee output;

這樣 就把exec 執行的結果 賦給變數了 ,而這個變數時out型別的,在c#端可取值,
但我翻了個嚴重的錯誤,一個很低階的錯誤,
在執行sql語句的時候,提示“過程需要引數 '@statement' 為 'ntext/nchar/nvarchar' 型別”,弄了半天弄的一頭霧水,
結果google了一下,才知道,它指的是這個@sql的型別,而我竟然定義的是varchar  ,悔呀,浪費了好多時間

 

5、在sql中執行儲存過程的寫法

exec  IOrderAddPriceRule_GetAddPrice  'CGQ','SFO',0,'FM','2009-7-15'   SPName後面直接跟引數,不需要引數名=引數值這樣的形式

 

6.declare @msg nvarchar(100);

set @msg='''gda'''+','+'''ab''';

select * from t_a where a.col1 in (@msg);

本來想用@msg拼接出in裡面的引數 ,如 in ('gda','ab')  可是用變數代替的話 卻總是出錯,還未解決為什麼呢

 

7.sqlserver的日期函式,貼上備用

getdate()  dateadd(day,2,'2004-10-15')  datediff(day,'2004-09-01','2004-09-18'day(), month(),year()

DATEPART(month, '2004-10-15') 

.DatePart('w','2005-7-25 22:56:32')返回值為 2 即星期一(週日為1,週六為7) 

datename 返回代表指定日期的指定日期部分的字串

datename(weekday, '2004-10-15')      --返回:星期五

select 本年第多少周=datename(week,'2004-10-15')
,今天是周幾=datename(weekday,'2004-10-15')

 convert(varchar(10),getdate(),120)  得到的結果為:2010-10-01

提醒:在使用日期函式時,其日期值應在1753年到9999年之間,這是SQL Server系統所能識別的日期範

 

8、兩個整數相除得到百分比
   Cast(Convert(decimal(10,2),(1.0 *Count(OrderId)/@OrderNum)*100) as varchar(20))+'%' As CancelPercent        ----decimal(10,2) 四捨五入保留兩位小數

 

9、寫儲存過程的時候要注意規範易讀性
/*
 功能:新增修改訂單合作商,如果存在訂單的合作商則修改,否則新增一條新紀錄,有出票合作商時要更新訂單表的出票合作商
 引數描述:
  @orderId    訂單ID
  @ticketIssuedCopartnerId 出票合作商ID
  @deliverCopartnerId  配送合作商ID
  @receiptMoneyCopartnerId 收款合作商ID
  @ticketIssuedCopartnerName 出票合作商名稱
  @deliverCopartnerName  配送合作商名稱
  @receiptMoneyCopartnerName 收款合作商名稱
 建立日期:2008-09-12 10 :32  建立人:小倩
*/
CREATE    PROCEDURE [dbo].[Orders_Copartner_Update] ..........

10、註冊sql快取依賴

aspnet_regsql -S 192.168.5.211 -U sa -P 123456 -d AirTicket -ed
aspnet_regsql -S 192.168.5.211 -U sa -P 123456 -d AirTicket -t AIrDistance -et

在visual studio 2005 命令提示視窗執行
(表 AspNet_SqlCacheTablesForChangeNotification 自動建表 )

 

11

今天開啟企業管理器-->表-->開啟,居然開不到資料,提示“未知錯誤:7008007E”,還以為是sqlserver出問題了呢,卸了裝,裝了卸,

操,還那個德行,沒管用,google一下,原來缺補丁,補丁下下來了,又她媽不會打,我還真是夠笨的,從網上摘了點,增強記憶。

查詢分析器:select @@version  結果是:Microsoft SQL Server  2000 - 8.00.194 (Intel X86)   Aug  6 2000 00:57:48   Copyright (c) 1988-2000 Microsoft Corporation  Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

相關文章