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)