SQLSERVER存储过程基础
SQLSERVER存储过程基础
1.声明变量
DECLARE @F001 SMALLINT, (三元素,声明declare+变量名+类型)
@F002 INTEGER,
@F003 VARCHAR(20),
@F004 CHAR(20),
@@F002 MONEY
2.赋值语句
SET @F001 =space(40) @F002= 3
3.条件判断(IF...ELSE)
IF condition BEGIN
[statements ]
END
ELSE BEGIN (ELSE IF condition2 BEGIN)
[elseifstatements ]
END
4.多分支判断(case[when...then...else...] end)
SET @F011 =
CASE
WHEN [testexpression1] THEN @F001
WHEN [testexpression2] THEN @F002
WHEN [testexpression3] THEN @F003
WHEN [testexpression4] THEN @F004
END
5.循环(while)
WHILE condition BEGIN
[statements ]
END
6.动态定义游标(*)
DECLARE @strSQL nvarchar(30)
DECLARE @inSQL nvarchar(50) -- select...
SET @strSQL = ' DECLARE name_cursor CURSOR FOR
' + @inSQL
EXEC (@strSQL)
7.遍历游标
FETCH NEXT FROM name_cursor into@F001,@F002 (要求与游标的返回值对应)
WHILE @@FETCH_STATUS = 0 BEGIN (如@inSQL是selectf001,f002 from tablename)
FETCH NEXT FROM name_cursor into @F001,@F002
END (说明:FETCH_STATUS检索到数据返回0,失败返回-1,可判断是否滚动未到结尾。)
8.获得游标行数
SET @RECCNT = @@ROWCOUNT --内嵌参数@@FETCH_STATUS
同
9.事务处理
BEGIN distributed transaction
WHILE @@TRANCOUNT > 0
commit transaction
10.字符串连接
SET @m_sql = @m_sql + ' Where F001 = ''' +@F001 + ''''
SET @m_sql = @m_sql + ' F002 = ' + CONVERT(varchar,@F002) convert会加引号?
11.存储过程的调用及返回值
(1)存储过程的创建 (sql server数据库中create procedure)
CREATE PROCEDURE material_solo_days_proc
(@materialnovarchar(20),
@year_month datetime,
@totalday int,
@qty decimal(18,4)=0 output
--总量,也会return
)
AS
BEGIN
DECLARE@@count
int
SET@@count = 0
DECLARE@@dailyqty
decimal(18,4)
SET@@dailyqty
= 0
SET@qty = 0
WHILE@@count < @totalday
BEGIN
--计算日流水量
EXECUTE @@dailyqty
= material_solo_oneday_proc @materialno,@year_month
SET @qty
= @qty + @@dailyqty
SET @year_month
= dateadd(dd,1,@year_month)
SET @@count
= @@count + 1
END
RETURN@qty
END
(2)SQL-DELPHI调用存储过程(open/execproc)
withmaterial_account_proc do
begin
Close;
ProcedureName:='material_account_proc';
Parameters.Clear;
Parameters.Refresh;
Parameters.ParamByName('@year_month').Value:= year_month;
Parameters.ParamByName('@condition').Value:= ''; //string不匹配nvarchar
open;
y :=Parameters.ParamByName('@count').Value;
x := Parameters.ParamByName('@totalday').Value;
end;
(3)存储过程调用存储过程
DECLARE @C001 VARCHAR(20),
@C002 SMALLINT
EXEC name_produce @C001,@C002 output
/////////////////////////////////////////////////////////////////////////////////
12.动态sql语句的创建和执行()
CREATE PROCEDURE usp_GetSalesHistory
(
@WhereClauseNVARCHAR(2000)=NULL
)
AS
BEGIN
DECLARE @SelectStatement NVARCHAR(2000)
DECLARE @FullStatement NVARCHAR(4000)
SET @SelectStatement = 'SELECT * FROM SalesHistory'
SET @FullStatement = @SelectStatement +ISNULL(@WhereClause,' ')
PRINT @FullStatement
EXECUTE sp_executesql @FullStatement
/*EXECUTE(@FullStatement) */
END
说明: sp_executesql
执行的不能是varchar只能是nvarchar,sp_executesql
支持独立于 Transact-SQL
字符串设置参数值,有更多例子网上搜。
Execute可以是varchar,而且execute的sql语句中的参数只能是属性列或者表
13.Update语句常见错误总结 (update .,.set where)
--√
Update name_table set
F001 = @F181,
F002 = @F182
Where
F003 = @F003
--×
Update name_table
F001 = @F181,
F002 = @F182
Where
F003 = @F003
--×
Update name_table set
F001 = @F181,
F002 = @F182,
Where
F003 = @F003
--×
Update name_table set
,F001 = @F181
,F002 = @F182
Where
F003 = @F003
14.Insert语句常见语法错误总结
--√
INSERT INTO name_table(
,KEY_FIELD,BUSYOCD
)Values(
@F001,@F002
)
--×
INSERT INTO name_table(
F001,F002
)Values(
,@F001,@F002
)
--×
INSERT INTO name_table(
F001,F002
)Values(
@F001,@F002,
)
--×
INSERT name_table(
F001,F002
)Values(
@F001,@F002
)
SQLSERVER存储过程基础的更多相关文章
- 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)
解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...
- Sqlserver 存储过程中结合事务的代码
Sqlserver 存储过程中结合事务的代码 --方式一 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ ...
- SqlServer存储过程学习笔记(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
- SQLServer 存储过程嵌套事务处理
原文:SQLServer 存储过程嵌套事务处理 某个存储过程可能被单独调用,也可能由其他存储过程嵌套调用,则可能会发生嵌套事务的情形. 下面是一种解决存储过程嵌套调用的通用代码,在不能确定存储过程是否 ...
- 创建并在项目中调用SQLSERVER存储过程的简单示例
使用SQLSERVER存储过程可以很大的提高程序运行速度,简化编程维护难度,现已得到广泛应用.创建存储过程 和数据表一样,在使用之前需要创建存储过程,它的简明语法是: 引用: Create PROC ...
- SQLSERVER存储过程语法详解
CREATE PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ...
- SqlServer存储过程详解
SqlServer存储过程详解 1.创建存储过程的基本语法模板: if (exists (select * from sys.objects where name = 'pro_name')) dro ...
- sqlServer存储过程与sql语句的区别
sqlServer 存储过程与sql语句的区别 sql存储过程与sql语句的区别: 从以下几个方面考虑: 1.编写: 存储过程:编写比较难: sql语句:相对简单: 2.性能: 存储过程:高,可移 ...
- SqlServer存储过程(增删改查)
* IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值. CREATE PROCEDURE [dbo].[PR_NewsAffiche_AddNewsEntity] ( ...
随机推荐
- .Net Core如何优雅的实现中间件
在.Net Core的源码中,很多地方都有中间件的地方,Kestrel Server和Asp.net Core 等都用了中间件的设计,比如在Kestrel Server中,Http协议的1.0, 1. ...
- 端口,InetSocketAddress类的使用
端口 端口表示计算机上的一个程序的进程: 不同的进程有不同的端口号!用来区分软件 被规定:0~65535 TCP,UDP:65535*2 单个协议下,端口号不能冲突 端口分类: 公有端口:0~1023 ...
- Linux连接工具final配置
Linux连接工具 putty .CRT.XShell 在terminal里面敲不太方便,所以需要一款连接工具 这是一款美观医用的网络服务管理软件 安装final shell Windows版下载地址 ...
- VRRP的基本配置
一.实验拓扑 二.实验编址 三.实验步骤: 1.设置PC的IP等信息 2.启动设备(全选) 3.设置路由器端口ip 4. 配置ospf网络 查看: 5.配置VRRP协议 配置完成后查看: 6.验证主备 ...
- 从一次netty 内存泄露问题来看netty对POST请求的解析
背景 最近生产环境一个基于 netty 的网关服务频繁 full gc 观察内存占用,并把时间维度拉的比较长,可以看到可用内存有明显的下降趋势 出现这种情况,按往常的经验,多半是内存泄露了 问题定位 ...
- (五)Linux之文件与目录管理以及文本处理
Linux之文件与目录管理 目录 Linux之文件与目录管理 前言 绝对路径与相对路径说明: 一.目录常用命令 常用处理目录的命令: 切换目录 cd 显示当前路径 pwd 查看目录下文件 ls 创建目 ...
- Clusternet - 新一代开源多集群管理与应用治理项目
作者 徐迪,腾讯云容器技术专家. 汝英哲,腾讯云高级产品经理. 摘要 在过去的数年里,云计算领域经历了多次巨大的变革,当前越来越多的组织将应用部署在本地和云上的多个基础设施平台上,这些平台可能是两个公 ...
- spring-cloud-sleuth+zipkin追踪服务
1, 父Maven pom 文件 <parent> <groupId>org.springframework.boot</groupId> <artifact ...
- mysql 局域网连接
下面分别简述操作: 配置虚拟机网络 默认方式是NAT,但为了让宿主机之外的其它计算机也能访问虚拟机,NAT方式配置起来有些复杂,这里推荐用桥接模式,关于VM的几种网络方式的区别,可以参考这篇文章配置好 ...
- sql查询第10条到第20条数据
select top(10) * from T1 where Id >= (select MAX(Id) from (select top(20) * from T1 order by Id) ...