sqlserver 临时表 游标 存储过程拼sql 日期函数等

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)

 




 

 

 

 

 

 

 

posted @ 2009-12-18 17:04  张倩  阅读(3318)  评论(0编辑  收藏  举报