sqlServer的存储过程:
1. 不能返回表变量;
2. 限制少,可以执行对数据库表的操作,可以返回数据集;
3. 可以return一个标量值,也可以省略return;
4. 存储过程一般用在实现复杂的功能和数据操纵方面。
存储过程是一个执行过程,可以有返回值:
(1) 创建带output参数的存储过程
CREATE PROCEDURE PR_Sum
@a int,
@b int,
@sum int output
AS
BEGIN
set @sum=@a+@b
END
(2) 创建Return返回值存储过程
CREATE PROCEDURE PR_Sum2
@a int,
@b int
AS
BEGIN
Return @a+@b
END
1. Alter Procedure相对CreateProcedure的优点:
(1) ALTER PROC 期望找到现存的存储过程,而CERATE不是。
(2) ALTER PROC 保留了已经建立的存储过程的任何权限。它在系统对象中保留了相同的对象ID并允许保留依赖关系。
例如,如果过程A调用过程B,并删除和重新创建了过程B,那么就不能再看到这两者之间的依赖关系。如果使用ALTER,则依赖关系依然存在。
(3) ALTER PROC 在其他对象上保留了任何依赖关系的信息,这些对象可以调用修改的存储过程。
example:
ALTER PROCEDURE [dbo].[P_InitiateChaseTask] -- 使用P_InitiateChaseTask存储过程
2. Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务。
(1) begin tran表示开始事务;
(2) commit tran表示提交事务;
(3) rollback tran表示回滚事物.
example:
SET NOCOUNT ON; -- 不返回计数(语句影响的行数的信息);可提高程序性能
BEGIN TRAN -- 开启事务
3. 定义变量,并为变量赋值
example:
DECLARE @decl INT --定义int类型变量
SET @decl = 0 --将变量赋值为0
DECLARE @careTable TABLE --定义一个临时的表变量@careTable,使用完会自动删除
( IsuseID BIGINT , --指定表字段信息
PlayTypeID INT ,
LotteryNumber VARCHAR(MAX) ,
Multiple INT ,
[Money] MONEY
)
(1) 声明的变量都以@或@@为前缀,表变量是变量的一种;
(2) 表的字段名如果与sql关键字冲突,要使用 [字段名] 进行处理;
(3) set赋值为最基本的赋值方法,当然还可以使用select/update等语法进行赋值操作:
example:
SELECT @Balance = Balance , --将查询结果Balance赋值给变量@Balance
@HandselTotal = HandselAmount
FROM T_Users --T_Users : 用户表
WHERE SiteID = @SiteID
AND [ID] = @UserID
UPDATE T_Users
SET Balance = Balance - @ThisBalanceDebit ,
HandselAmount = HandselAmount - @ThisHandselDebit ,
WHERE [ID] = @UserID
4. INSERT INTO
(1) 常规插入
INSERT INTO T_UserDetails
( SiteID , UserID , OperatorType , [Money] , HandselAmount )
VALUES ( @SiteID ,
@UserID ,
dbo.F_GetDetailsOperatorType('追号冻结') , --获取账户交易类型: when '追号冻结' then 103
@ThisBalanceDebit ,
@ThisHandselDebit
)
(2) 将一个表的数据添加到另一个表中
INSERT INTO @careTable --把临时表#TempP_InitiateChaseTask相应字段的数据..复制到表变量@careTable中
(IsuseID, PlayTypeID, LotteryNumber, Multiple, [Money], SecrecyLevel, Share, BuyedShare, AssureShare )
SELECT
IsuseID, PlayTypeID, LotteryNumber, Multiple, [Money], SecrecyLevel, Share, BuyedShare, AssureShare
FROM
#TempP_InitiateChaseTask
DROP TABLE #TempP_InitiateChaseTask --将#TempP_InitiateChaseTask表 销毁
5. sp_xml_preparedocument和sp_xml_removedocument
example:
DECLARE @Pointer INT -- 定义XML文档的内部表式形式的文档句柄
EXECUTE sp_xml_preparedocument @Pointer OUTPUT, @DetailXML --使用sp_xml_preparedocument读取@DetailXML(文件)的xml数据
SELECT IsuseID, PlayTypeID, LotteryNumber, Multiple, [Money] ,
SecrecyLevel, Share, BuyedShare, AssureShare
INTO #TempP_InitiateChaseTask --将查询结果存入临时表#TempP_InitiateChaseTask中(#开头)
FROM OPENXML (@Pointer,'/ChaseDetail/Isuse') --使用OPENXML获取读取的xml数据,,
--'/ChaseDetail/Isuse'为XPath,获取指定节点内容
WITH (IsuseID BIGINT, PlayTypeID INT, LotteryNumber VARCHAR(MAX), Multiple INT,
[Money] MONEY, SecrecyLevel INT,Share INT,BuyedShare INT,AssureShare INT ) --指定要获取信息的字段
//以上执行完毕,临时表#TempP_InitiateChaseTask中数据就是(解析)读取的xml文档的内容
EXEC sp_xml_removedocument @Pointer --删除文档句柄指定的 XML 文档的内部表示方式并使该文档句柄无效
6. SELECT TOP ( 1 ) 和 SELECT 1
example:
SELECT TOP ( 1 ) --查询@careTable, 获取符合条件的查询结果的第一条记录
@Numbers = LotteryNumber , --将查询结果字段值赋给定义的变量@
@isusersiD = IsuseID ,
@Multiple2 = Multiple --若查询的是临时表或临时表变量,则可以通过删除SELECT TOP ( 1 )的记录,来实现遍历
FROM @careTable
IF NOT EXISTS ( SELECT 1 FROM #TempP_InitiateChaseTask ) --查看是否有记录,一般用作判断条件
7. 多表查询
example:
SELECT @LotteryCount = COUNT(*)
FROM ( SELECT LotteryID
FROM ( SELECT b.LotteryID
FROM #TempP_InitiateChaseTask a
LEFT JOIN T_Isuses b --T_Isuses : 期号表
ON a.IsuseID = b.ID ) c --左连接 :返回包括左表中的所有记录和右表中联结字段相等的记录
GROUP BY LotteryID ) d
8. ISNULL 和 REPLACE
example:
SET @UserHandselAmount = ( SELECT ISNULL(HandselAmount, 0) --使用指定的值替换 NULL
FROM dbo.T_Users
WHERE ID = @UserID )
--用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式
SET @InvestNums34 = REPLACE(@InvestNums34, '.00', '')
9. SCOPE_IDENTITY()
SELECT @ChaseTaskID = SCOPE_IDENTITY() --SCOPE_IDENTITY() 返回插入到同一作用域中的标识列内的最后一个标识值
10. 游标是处理结果集的一种机制,能从包括多条数据记录的结果集中每次提取一条记录的机制
example:
DECLARE @Cur CURSOR --声明游标
DECLARE @ChaseTaskDetailID BIGINT
SET @Cur = cursor FAST_FORWARD for --定义游标 --FAST_FORWARD指定启用了性能优化的Forward_Only、Read_Only游标
select [ID] from T_ChaseTaskDetails -- 游标值为每条数据的id
where SiteID = @SiteID
and ChaseTaskID = @ChaseTaskID
and GetDate() between dbo.F_GetIsuseStartTime(IsuseID)
and dbo.F_GetIsuseSystemEndTime(IsuseID, PlayTypeID)
order by [ID]
OPEN @Cur --打开游标
FETCH NEXT FROM @Cur INTO @ChaseTaskDetailID --提取游标数据
WHILE @@fetch_status = 0 --游标读取下一条数据是否成功
BEGIN
DECLARE @ReturnValue_2 INT
DECLARE @ReturnDescription_2 VARCHAR(100)
EXEC dbo.P_ExecChaseTaskDetail --执行dbo.P_ExecChaseTaskDetail存储过程
@SiteID, @ChaseTaskDetailID, --输入参数
@ReturnValue_2 OUTPUT, @ReturnDescription_2 OUTPUT --输出结果
FETCH NEXT FROM @Cur INTO @ChaseTaskDetailID --读取下一行数据
END --fetch into 移动游标提取数据
CLOSE @Cur --关闭游标
1. "FETCH 参数 FROM 游标名 INTO 变量"为提取游标数据语法:
参数说明:
Frist:结果集的第一行;
Prior:当前位置的上一行;
Next:当前位置的下一行;
Last:最后一行;
Absoute n:从游标的第一行开始数,第n行;
Relative n:从当前位置数,第n行.
2. 全局变量@@Fetch_Status可能出现3种值:0(Fetch语句成功); -1(Fetch语句失败或行不在结果集中); -2(提取的行不存在)
通过检测该值,获得提取状态信息,该状态用于判断Fetch语句返回数据的有效性。