当前位置:首页 » 存储配置 » 存储过程的使用场景

存储过程的使用场景

发布时间: 2023-04-22 07:11:07

‘壹’ sql procere 怎么调用

为了演示方便,新创建了一个存储过程 [dbo].[pr_test] 。
怎么调用SQL存储过程

存储过程内容很简单就是几个数字,实际应用中可能还会使用的到一些存储过程参数。
怎么调用SQL存储过程

执行存储过程,来检验一下新建的存储过程结果集。
怎么调用SQL存储过程

若我们在其实场景需要调用这个存储过程中的结果集,则不需要直接调用,而是将结果集先插入一个临时表即可。

create table #data (

Ftest1 int,

Ftest2 int,

Ftest3 int

)

注意:表定义的列数目要与存储过程的一致。
怎么调用SQL存储过程

临时表创建好了之后,使用insert into #data exec [dbo].[pr_test] 将结果集插入到临时表#data中。
怎么调用SQL存储过程

可以将以上的创建临时表和插入存储过程结果的SQL语句放在需要的调用存储过程的场景中。
怎么调用SQL存储过程

这样就可以通过临时表#data来连接其他表了。

‘贰’ sql 存储过程 游标用在什么地方(新手刚学,不知道使用场景)我是C#做Web开发的

web开发很多用orm框架,存储过程和游标都很少用。比如你用EF提倡CodeFirst,这得看你框架的规则上进行。纯粹来讲所有的sql执行语句都可以放到存储过程里。比如insert,uodate,delete,select都可以。存储过程有执行速度快的优势,参数传递占用空间小。同时方便后期修改和管理。比如像我现在用的一个简单的存储过程,返回当前客户期数:
create proc proc_name(@account nvarchar(30))
as
begin
/*-------------------------------------------------------------------------------------
程序说明:返回当前客户的期初数,业务结算月为26,以打印时间为准
BY:ChuiFeng 2013-02-27
返回结果:@CreditAmount字段
-------------------------------------------------------------------------------------*/
declare @ARAmount decimal(22,10) = 0 --已经收到的客户金额, 实收金额
declare @SaleAmount decimal(22,10) = 0 --货物金额, 应收金额
--declare @amount decimal(22,10) =0 --存放期初
declare @endDate datetime --截止日期
--构造截止日期
if(DATEPART(DAY, GETDATE())>26) --当前日期超过结算日26号
set @endDate = CAST(CAST(DATEPART(year, GETDATE()) AS varchar(4)) + '-' + CAST(DATEPART(MONTH, GETDATE()) AS nvarchar(2)) + '-26' AS DateTime)
else
set @endDate = CAST(CAST(DATEPART(year, GETDATE()) AS varchar(4)) + '-' + CAST(DATEPART(MONTH, GETDATE())-1 AS nvarchar(2)) + '-26' AS DateTime)
select @ARAmount=SUM(Amount) from T_AR where CusCode=@account and PrintState=255 and DATEDIFF(DAY,PrintedTime,@endDate)>0
--select @SaleAmount=SUM(Amount) from T_SOs where SONO in (select SONO from T_SO where CusCode=@account and PrintState=255 and DATEDIFF(DAY,PrintedTime,@endDate)>0)
select @SaleAmount=SUM(Amount) from T_SO where CusCode=@account and PrintState=255 and DATEDIFF(DAY,PrintedTime,@endDate)>0
if(@ARAmount is null) set @ARAmount=0
if(@SaleAmount is null) set @SaleAmount=0

return @SaleAmount-@ARAmount
end

如果客户需求发生了变化比如结算日改了,那么我们只需要修改存储过程就行了 而不必要修改程序代码重新编译

至于游标:建议慎用 少用。主要就是性能问题。一般是在大数据量循环的情况下可能用但是最好别用,用好的存储过程可以实现就别用游标...

‘叁’ 为什么web项目开发者很少使用存储过程

你可以想想存念罩掘储过程都在什仔核么业务场景下会用?
一般银行,保险等金融机构,这种场景下web肯定少啊闷茄

‘肆’ 存储过程记录日志怎么理解

您可以参考以下信息去理解:
存储过程存储了一系列sql语句
存储过程的需求场景:下边是一个经典的需求场景,很多Mysql的书都有:
存储过程存储了一系列sql语句,使得简化了操作,不要求重复执行一系列操作。只需要在需要的时候调用一下存储过程就行了。
一般来说,可以认为存储过程的功能与函数的功能类似(应该都学樱改过函数吧),但只是要注意存储过程没有脊洞判返回值,所以可以依据函颤卖数可用场景来理解存储过程。

‘伍’ 在entity framework中怎么调用存储过程

一、使用存储过程的必要性
我们知道EF通过元数据,即概念模型(Concept Model)、存储模型(Storage Model)和概念/存储映射(C/S Mapping),和状态追踪(State Tracking)机制可以为基于模型的操作自动生成SQL。对于一些简单的项目开发,这是非常理想的,因为他们完全可以不用关注数据存储层面的东西,你可以采用一些完全不具有数据库知识的开发者。但是理想总归是理想,对于企业级开发来说,我们需要的是对数据库层面数据的操作有自己的控制。在这方面,我们可以随便举两个典型的场景:
逻辑删除:对于一些重要的数据,我们可能需要让它们永久保存。当我们试图“删除”这些数据的时候,我们并不是将它们从数据表中移除(物理删除),而是为这条记录作一个已经被删除的标记;
并发处理:为了解决相同的数据在获取和提交这段时间内被另一个用户修改或者删除,我们往往SQL层面增加并发控制的逻辑。比较典型的做法是在每一个表中添加一个VersionNo这样的字段,你可以采用TimeStamp,也可以直接采用INT或者GUID。在执行Update或者Delete的SQL中判断之前获取的VersionNo是否和当前的一致。
让解决这些问题,就不能使用EF为我们自动生成的SQL,只有通过使用我们自定义的存储过程。
二、实现存储过程自动匹配的必要条件
本篇文章提供的存储过程自动映射机制是通过代码生成的方式完成的。说白了,就是读取原来的.edmx模型文件,通过分析在存储模型中使用的数据表,导入基于该表的CUD存储过程;然后再概念/存储映射节点中添加实体和这些存储过程的映射关系。那实现这样的代码生成,需要具有如下三个固定的映射规则。
数据表名-存储过程名:这个映射关系帮助我们通过存储模型中的实体名找到对应CUD三个存储过程(如果实体是数据表);
数据表列名-存储过程参数名:当存储过程被执行的时候,通过这个映射让概念模型实体某个属性值作为对应的参数;
存储过程参数名-版本:当进行参数赋值的时候,通过这个映射决定是使用Original或者Current版本。
在实际的开发过程中,这样的标准存储过程一般都是通过代码生成器生成的(在我的文章《创建代码生成器可以很简单:如何通过T4模板生成代码?[下篇]》中有过相应的实现),它们具有这样的映射关系。
基于这三种映射关系,我定义了如下一个名为IProcereNameConverter的接口。其中OperationKind是我自定义的一个表示CUD操作类型的枚举。
1: public interface IProcereNameConverter
2: {
3: string GetProcereName(string tableName, OperationKind operationKind);
4: string GetColumnName(string parameterName);
5: DataRowVersion GetVersion(string parameterName);
6: }
7:
8: public enum OperationKind
9: {
10: Insert,
11: Update,
12: Delete
13: }

按照我们当前项目采用的命名规范,我定义了如下一个默认的DefaultNameConverter。它体现的是这样的映射关系,比如有个数据表明为T_USER(大写,单词之间用“_”隔开,并以T_为前缀),它对应的CUD存储过程名分别为:P_USER_I、P_USER_U和P_USER_D(大写,以代表存储过程的P_为前缀,后缀_I/U/D表示CUD操作类型,中间为去除前缀的表名)。如果列名为USER_ID,参数名为p_user_id(小写,加p_前缀)。如果需要用Original值为参数赋值,需要将p_前缀改成o_前缀(o_user_id)。
1: public class DefaultNameConverter: IProcereNameConverter
2: {
3: public string GetProcereName(string tableName, OperationKind operationKind)
4: {
5: switch (operationKind)
6: {
7: case OperationKind.Insert:
8: return string.Format("P_{0}_I", tableName.Substring(2));
9: case OperationKind.Update:
10: return string.Format("P_{0}_U", tableName.Substring(2));
11: default:
12: return string.Format("P_{0}_D", tableName.Substring(2));
13: }
14: }
15:
16: public string GetColumnName(string parameterName)
17: {
18: return parameterName.Substring(2).ToUpper();
19: }
20:
21: public DataRowVersion GetVersion(string parameterName)
22: {
23: if(parameterName.StartsWith("o"))
24: {
25: return DataRowVersion.Original;
26: }
27: else
28: {
29: return DataRowVersion.Current;
30: }
31: }
32: }

三、通过T4生成新的.edmx模型
我们采用的基于T4的代码生成,了解EF的应该对T4不会感到陌生了。如果对代码生成感兴趣的话,可以看看我的文章《与VS集成的若干种代码生成解决方案[博文汇总(共8篇)]》。这里利用借助于T4 ToolBox这个开源工具箱,并采用SQL Server SMO获取存储过程信息。所有涉及到的文本转化都实现在如下一个ProcereMappingTemplate类型中,由于内容较多,具体实现就忽略了,有兴趣的朋友可能下载源代码。ProcereMappingTemplate具有两个构造函数的参数分别表示:源.edmx文件,服务器和数据库名,存储过程的Schema(默认为dbo)和具体的ProcereNameConverter(默认为DefaultNameConverter)。
1: public class ProcereMappingTemplate: Template
2: {
3: public XmlDocument SourceModel { get; private set; }
4: public IProcereNameConverter ProcereNameConverter { get; private set; }
5: public Database Database { get; private set; }
6: public string Schema { get; private set; }
7:
8: public ProcereMappingTemplate(string sourceModelFile, string serverName, string databaseName);
9: public ProcereMappingTemplate(string sourceModelFile, string serverName, string databaseName,
10: IProcereNameConverter procereNameConverter, string schema);
11:
12: protected virtual XElement GenerateStorageModelNode();
13: protected virtual XElement GenerateMappingNode();
14: public override string TransformText()
15: {
16: XElement newStorageModelNode = this.GenerateStorageModelNode();
17: XElement newMappingNode = this.GenerateMappingNode();
18:
19: XmlNode storageModelNode = this.SourceModel.GetElementsByTagName("edmx:StorageModels")[0];
20: storageModelNode.InnerXml = newStorageModelNode.Elements().ToArray()[0].ToString();
21:
22: XmlNode mappingNode = this.SourceModel.GetElementsByTagName("edmx:Mappings")[0];
23: mappingNode.InnerXml = newMappingNode.Elements().ToArray()[0].ToString();
24:
25: this.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
26: this.Write(this.SourceModel.DocumentElement.OuterXml.Replace("xmlns=\"\"",""));
27: return GenerationEnvironment.ToString();
28: }
29: }

在使用过程中,你只需要在tt模板中创建这个ProcereMappingTemplate对象,调用Render方法即可。
1: <#@ template debug="true" hostSpecific="true" #>
2: <#@ output extension=".edmx" #>
3: <#@ assembly name="Microsoft.SqlServer.ConnectionInfo" #>
4: <#@ assembly name="Microsoft.SqlServer.Smo" #>
5: <#@ assembly name="Microsoft.SqlServer.Management.Sdk.Sfc" #>
6: <#@ assembly name="$(TargetDir)Artech.ProcereMapping.dll" #>
7: <#@ import namespace="Artech.ProcereMapping" #>
8: <#@ include file="T4Toolbox.tt" #>
9: <#
10: new ProcereMappingTemplate(this.Host.ResolvePath("UserModel.edmx"),".","EFExtensions").Render();
11: #>

四、看看生成出来的.emdx
通过上面创建的TT模板(你指定的数据库中一定要存在具有相应映射关系的存储过程),新的.edmx模型文件会作为该tt文件的依赖文件被生成出来。而这个新生成的.edmx具有存储过程映射信息。具体来说,下面是原始的.edmx文件(只保留元数据节点)。
1: <?xml version="1.0" encoding="utf-8"?>
2: <edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
3: <!-- EF Runtime content -->
4: <edmx:Runtime>
5: <!-- SSDL content -->
6: <edmx:StorageModels>
7: <Schema Namespace="Artech.UserModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
8: <EntityContainer Name="ArtechUserModelStoreContainer">
9: <EntitySet Name="T_USER" EntityType="Artech.UserModel.Store.T_USER" store:Type="Tables" Schema="dbo" />
10: </EntityContainer>
11: <EntityType Name="T_USER">
12: <Key>
13: <PropertyRef Name="USER_ID" />
14: </Key>
15: <Property Name="USER_ID" Type="varchar" Nullable="false" MaxLength="50" />
16: <Property Name="USER_NAME" Type="nvarchar" Nullable="false" MaxLength="50" />
17: </EntityType>
18: </Schema>
19: </edmx:StorageModels>
20: <!-- CSDL content -->
21: <edmx:ConceptualModels>
22: <Schema Namespace="Artech.UserModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
23: <EntityContainer Name="EFExtensionsEntities" annotation:LazyLoadingEnabled="true">
24: <EntitySet Name="Users" EntityType="Artech.UserModel.User" />
25: </EntityContainer>
26: <EntityType Name="User">
27: <Key>
28: <PropertyRef Name="ID" />
29: </Key>
30: <Property Name="ID" Type="String" Nullable="false" MaxLength="50" Unicode="false" FixedLength="false" />
31: <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
32: </EntityType>
33: </Schema>
34: </edmx:ConceptualModels>
35: <!-- C-S mapping content -->
36: <edmx:Mappings>
37: <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
38: <EntityContainerMapping StorageEntityContainer="ArtechUserModelStoreContainer" CdmEntityContainer="EFExtensionsEntities">
39: <EntitySetMapping Name="Users">
40: <EntityTypeMapping TypeName="Artech.UserModel.User">
41: <MappingFragment StoreEntitySet="T_USER">
42: <ScalarProperty Name="ID" ColumnName="USER_ID" />
43: <ScalarProperty Name="Name" ColumnName="USER_NAME" />
44: </MappingFragment>
45: </EntityTypeMapping>
46: </EntitySetMapping>
47: </EntityContainerMapping>
48: </Mapping>
49: </edmx:Mappings>
50: </edmx:Runtime>
51: </edmx:Edmx>

这是新生成的.edmx文件中的XML。

‘陆’ SQL SERVER 一个数据库中使用大量的存储过程,会影响性能吗

一、在SQL Server中存储过程不会影响性能。
1、只会大大的减轻服务器的压力,而不会增加,只有不合理的存储过程才会造成服务器性能下降的恶果。一个大型的数据库,一般铅没存储过程也不会超过几千个,对当前的数据库及它依附的硬件来说,这点儿负载是大象身上的老鼠,负载基本可以怱略不计。
2、但是,存储过程是批量的SQL语句的合成,如果设计上混乱,引发死循环、死锁、大范围查询、临时表没有及时清理释放等问题的情况下,是会严重影响服务器性能的,但这根子不在存储过程上,而在于存储过程的设计上。错误的SQL代码指挥服务灶历器,无论它的形式是存储过程,还是客户端及时发向数据库的请求,都会使服务器出现问题。

二、相关扩展
1、在当前,针对数据库的编程设计,没有存储过程是不可想象的,这就象某个公司的大型货品仓库中没有仓库保管员一样,所有的货品进出都得进货员或销售员去临时取放,会严重降低工作效率。
2、存储过程在数据库中无论是否编译好,其效率都要比客户端临时向数据库发槐辩纳送指令调数据来得要高,因为至少减少了发向服务器的指令的量。况且很多的中间值、临时值如果不通过存储过程来实现的话,就只能先全取到客户端,这样会大大增加网络负担与服务器的负钽。
3、正如微软所说,存储过程来实现,可以使得很多中间量不必传入到客户上,客户端只能得到需要的结果,所以同时可以提高安全。

‘柒’ 存储过程的变量指什么

存储过程是面向对象的数据库编程语言,与其他面向对象编程语言类似,可声明变量,用变量来存取某一类值,变量在存储过程中占有非常重要的位置。变量声明在MySQL语言的存储过程中,变量有会话变量、存储过程变量两种。两种变量的声明方式不同,作用场景也不尽相同,在实际使用中要根据需要加以选择。

1.变量种类((1)会话变量会话变量也称用户变量,可以在一个客户端会话的任何地方声明,作用域是整个会话,会话断开后,会话变量也就消失。会话变量名以@开头,使用set直接赋值,在一个会话内,会话变量只需初始化一次。

例如,Set@num=1;表示声明了一个名字叫“@num”的会话变量,其初始值为1。

(2)存储过程变量存储过程变量以DECLARE为关键字声明的变量,只能在存储过程中使用,其命名不需要以@开头。以DECLARE声明的变量都会被初始化为NULL,存储过程变量存在于数据库服务器上。2.变量定义存储过程变量定义格式:DECLARE+变量名+数据类型+[DEFAULTVALUE]其中,((1)DECLARE为声明存储过程变量的关键字;

(2)变量名可以任意,但尽可能达到能表意的目的;

(3)数据类型为MySQL的数据类型,如int

‘捌’ ASP.NET中如何执行各种类型的存储过程

看到这个手写的类,就知道还是手工作坊的产物。

在实际项目中从不用手写数据访问类,用微软给的,或者用MSORM直接生成,

比这样手写,更快,更安全,代码量更少,调用更方便。

---------------------------

代码重用目地在于提高生产力,

并不是你写一个类就永垂不朽了,

而是要在需求有变更的情况下,能够复用和扩展。

你可以看看.NET里面的ORM是如何进行代码复用和扩展的,

观察一下数据库结构以及存储过程改变的情况下,代码是如何变化的。

事实上,完全不需要手动编码。

能够应付更加复杂的应用场景和需求变更,才能提高生产力,才能被称之为面向对象。

热点内容
安卓手机如何拷贝电脑里 发布:2025-02-12 16:16:30 浏览:859
linux怎么编译内核 发布:2025-02-12 16:03:02 浏览:188
新的怎么注册微信账号密码忘了怎么办 发布:2025-02-12 15:50:08 浏览:658
android代码搜索 发布:2025-02-12 15:45:36 浏览:778
矢量图算法 发布:2025-02-12 15:43:53 浏览:192
python量化投资入门 发布:2025-02-12 15:34:17 浏览:174
苹果的天气跟安卓的天气哪个准 发布:2025-02-12 15:33:37 浏览:313
西安分布式存储咨询 发布:2025-02-12 15:33:24 浏览:179
我的世界服务器怎么获得32k乱码棒 发布:2025-02-12 15:25:15 浏览:545
hadoopftp 发布:2025-02-12 15:22:23 浏览:753