SqlServer调用存储过程返回结果集

合集下载

SQLServer存储过程返回值总结.

SQLServer存储过程返回值总结.

SQLServer 存储过程返回值总结1. 存储过程没有返回值的情况 (即存储过程语句中没有 return 之类的语句用方法 int count = ExecuteNonQuery(..执行存储过程其返回值只有两种情况(1假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行 count 就是几(2假如通过查询分析器执行该存储过程, 在显示栏中假如显示 ' 命令已成功完成。

' 则 count = -1;在显示栏中假如有查询结果,则 count = -1总结:A.ExecuteNonQuery(该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是 -1,不会为 0。

B.不论 ExecuteNonQuery(方法是按照CommandType.StoredProcedure 或者 CommandType.Text 执行, 其效果和 A 一样。

---------------------------------------------------------------------------------------------------------------------------------------------------2. 获得存储过程的返回值 --通过查询分析器获得(1不带任何参数的存储过程 (存储过程语句中含有 return---创建存储过程CREATE PROCEDURE testReturnASreturn 145GO---执行存储过程DECLARE @RC intexec @RC=testReturnselect @RC---说明查询结果为 145(2带输入参数的存储过程 (存储过程语句中含有 return ---创建存储过程create procedure sp_add_table1@in_name varchar(100,@in_addr varchar(100,@in_tel varchar(100asif(@in_name = '' or @in_name is nullreturn 1elsebegininsert into table1(name,addr,telvalues(@in_name,@in_addr,@in_telreturn 0end---执行存储过程<1>执行下列,返回 1declare @count int exec @count = sp_add_table1 '','中三路 ','123456' select @count <2>执行下列,返回 0declare @count int exec @count = sp_add_table1 '','中三路 ','123456' select @count ---说明查询结果不是 0就是 1(3带输出参数的存储过程 (存储过程中可以有 return 可以没有 return例子 A :---创建存储过程create procedure sp_output@output int outputasset @output = 121return 1---执行存储过程<1>执行下列,返回 121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回 1declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明有 return ,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为 return 返回的值例子 B :---创建存储过程create procedure sp_output@output int outputasset @output = 121---执行存储过程<1>执行下列,返回 121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回 0declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明没有 return ,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为 0总结:(1存储过程共分为 3类:A. 返回记录集的存储过程 ---------------------------其执行结果是一个记录集,例如:从数据库中检索出符合某一个或几个条件的记录B. 返回数值的存储过程 (也可以称为标量存储过程 -----其执行完以后返回一个值,例如:在数据库中执行一个有返回值的函数或命令C. 行为存储过程 -----------------------------------用来实现数据库的某个功能,而没有返回值,例如:在数据库中的更新和删除操作(2含有 return 的存储过程其返回值为 return 返回的那个值(3没有 return 的存储过程,不论执行结果有无记录集,其返回值是 0(4带输出参数的存储过程:假如有 return 则返回 return 返回的那个值,假如要select 输出参数,则出现输出参数的值,于有无 return 无关---------------------------------------------------------------------------------------------------------------------------------------------------3. 获得存储过程的返回值 --通过程序获得---------------------------------------------------------------------------------------------------------------------------------------------------SqlParameter[] cmdParms = { .. ,newSqlParameter("@return",SqlDbType.Int};cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.ReturnValue; 或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Output或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Input; 得到返回值 object bj = cmdParms[cmdParms.Length - 1].Value;。

怎样从SQLServer2005CLR存储过程返回结果集-电脑资料

怎样从SQLServer2005CLR存储过程返回结果集-电脑资料

怎样从SQLServer2005CLR存储过程返回结果集-电脑资料问题我们有时会遇到关于CLR函数或存储过程的需求,。

例如我们可能需要调用一个存储过程来获得某一特定文件夹下的文件列表。

我们怎样使用CLR将文件列表作为一个标准结果集(例如行和列)返回呢?专家解答SQL Server 2005和之后的版本集成了CLR(通用语言运行时),它使得我们可以使用Microsoft .NET代码编写存储过程、触发器、用户友好的函数、用户友好的聚合和用户友好的类型;例如Visual Basic .NET或C#。

被增强的各种T-SQL CREATE命令使得我们可以定义一个数据库对象(例如一个存储过程)并将我们的.NET代码与它连接起来。

当你执行这个存储过程的时候,.NET代码就被执行了。

当编写一个存储过程或函数时,返回数据所用的最常见方法是结果集。

在这篇技巧中,我们将执行一个存储过程来获得某个文件夹的文件列表并将这个列表作为一个具有行和一列的标准结果集返回。

我们将执行下面的步骤:激活CLR。

获得C#代码示例。

部署CLR存储过程。

激活CLR默认情况下,在SQL Server 2005中CLR没有激活。

你可以通过执行外围应用配置器(Surface Area Configuration)工具或sp_configure来激活CLR。

在外围应用配置器中点开层级找到CLR Integration,然后点击复选框来激活它,如下图所示:要使用sp_configure来激活CLR,执行下面的脚本:sp_configure 'clr enabled', 1GOreconfigureGO代码示例下面的C#函数将获得某文件夹的文件列表并将这个列表作为一个结果集返回。

这个函数的参数如下所示:path——获取文件所在的文件夹;例如C:\TEMP。

pattern——通配符,如*.*(所有文件),*.dat,等等。

recursive——是否包含在子文件夹下的文件;1代表true,否则为0。

SqlServer存储过程调用存储过程接收输出参数返回值

SqlServer存储过程调用存储过程接收输出参数返回值
接收输出参数:
DECLARE @count INT EXECUTE GetCustomers @count OUTPUT PRINT @count
2,带返回值
创建存储过பைடு நூலகம்:
ALTER PROCEDURE [dbo].[GetCustomers] AS
SELECT [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode] ,[Country] ,[Phone] ,[Fax] FROM [Northwind].[dbo].[Customers] RETURN @@rowcount
创建存储过程:
ALTER PROCEDURE [dbo].[GetCustomers] (@rowcount INT OUTPUT) AS
SELECT [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode] ,[Country] ,[Phone] ,[Fax] FROM [Northwind].[dbo].[Customers] SET @rowcount=@@rowcount
接收返回值:
DECLARE @count INT EXECUTE @count=GetCustomers PRINT @count
以上所述是小编给大家介绍的Sql Server 存储过程调用存储过程接收输出参数返回值,希望对大家有所帮助,如果大家有任何 疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

SqlServer调用存储过程返回结果集

SqlServer调用存储过程返回结果集

USE[zhuhaioa7-4]GO/****** Object: StoredProcedure [dbo].[proc_records] Script Date: 12/26/2014 20:31:09 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER procedure[dbo].[proc_records]asDECLARE@map_table table(r_key varchar(100),r_value varchar(50))DECLARE@type_id varchar(40)DECLARE@type_name varchar(50)DECLARE@project_id varchar(40)DECLARE@project_name varchar(50)DECLARE@payTypeMoney numeric(16, 2)DECLARE@sumPayTypeMoney numeric(16, 2)BEGINset@payTypeMoney= 0set@sumPayTypeMoney= 0--查询项目列表DECLARE project_cursor CURSOR for select ep_id,ep_name from AB_engineeringPhase where account_id='2' open project_cursorfetch next from project_cursor into@project_id,@project_namewhile@@FETCH_STATUS= 0begin--查询项目支付类别DECLARE projectType_cursor CURSOR for select id,name from T_DataItem where typeId='payType'order by sort ascopen projectType_cursorfetch next from projectType_cursor into@type_id,@type_namewhile@@FETCH_STATUS= 0begin--业务逻辑处理处理内层游标--获取一个项目某一项支付类型的数据--查询一个项目某一支付类别金额select@payTypeMoney=sum(checkProjectPayMoney)from JiLiangZhiFu where projectId=@project_id and payType=@type_id group by payType--一个项目某一支付类别金额存入insert into@map_table values(@project_id+','+@type_id,@payTypeMoney)--一个项目累计支付类别金额set@sumPayTypeMoney=@sumPayTypeMoney+@payTypeMoney--一个项目某一支付类别金额重置为set@payTypeMoney= 0fetch next from projectType_cursor into@type_id,@type_name--内层游标向下移动一行end--插入某一项目各个支付类别的金额合计insert into@map_table values(@project_id,@sumPayTypeMoney)set@sumPayTypeMoney= 0close projectType_cursordeallocate projectType_cursorfetch next from project_cursor into@project_id,@project_name--内层游标处理结束后,外层游标才继续向下移动一行endclose project_cursordeallocate project_cursorselect*from@map_tableENDpublic Map getProjectPayMoneyByPayType() {try {return (Map)this.getHibernateTemplate().execute(new HibernateCallback(){public Object doInHibernate(Session session) throws HibernateException, SQLException { Connection con = session.connection();Statement stmt = con.createStatement();CallableStatement cs = con.prepareCall("{call proc_records}");//ResultSet rs = stmt.executeQuery("{call proc_records}");ResultSet rs = cs.executeQuery();Map map = new HashMap();while (rs.next()) {map.put(rs.getString(1), rs.getString(2));}rs.close();stmt.close();return map;}});} catch ( org.springframework.dao.DataAccessException e) { throw new DataAccessException(e.getMessage(),e);}}。

sqlserver 函数中调用存储过程

sqlserver 函数中调用存储过程

SQL Server 函数中调用存储过程简介在 SQL Server 数据库中,函数(Function)和存储过程(Stored Procedure)是分别用于执行特定功能的两种对象。

函数是一种可以接受参数并返回一个值的操作,而存储过程则是一组预定义的 SQL 语句集合,可接受输入参数并返回结果集或修改数据库状态。

本文将介绍如何在 SQL Server 函数中调用存储过程,实现在函数内部对存储过程进行调用并获取结果的功能。

通过调用存储过程,我们可以将复杂的逻辑封装起来,并在函数中直接使用。

为什么要在函数中调用存储过程?在 SQL Server 中,函数具有一些限制和特性,如只能访问数据库的静态数据、不能修改数据库状态等。

这些限制使得函数的功能有一定的局限性。

而存储过程可以执行更复杂的操作,包括访问动态数据、修改数据库状态、执行事务控制等。

因此,将存储过程与函数结合使用,可以充分发挥它们各自的优势,实现更灵活和强大的功能。

通过在函数中调用存储过程,我们可以在函数内部执行复杂的业务逻辑,同时利用存储过程的强大功能,使函数具有更高的灵活性和功能性。

在函数中调用存储过程的实现方法下面将介绍在 SQL Server 函数中调用存储过程的实现方法。

主要分为以下几个步骤:1. 创建存储过程首先,我们需要创建一个存储过程,用于实现我们想要的功能。

可以使用 SQL Server Management Studio 或其他 SQL 编辑工具来创建存储过程。

存储过程的创建语法如下:CREATE PROCEDURE procedure_name@parameter1 data_type,@parameter2 data_type,...ASBEGIN-- 存储过程的逻辑代码END在存储过程中,可以定义输入参数和输出参数,根据实际需求进行编写。

存储过程中的逻辑代码可以包括 SQL 查询、数据处理、事务控制等。

2. 创建函数创建函数的语法与创建存储过程类似,可以使用 SQL Server Management Studio 或其他 SQL 编辑工具来创建函数。

SQL_Server存储过程返回值总结

SQL_Server存储过程返回值总结

SQL Server存储过程返回值总结1. 存储过程没有返回值的情况(即存储过程语句中没有return之类的语句)用方法int count = ExecuteNonQuery(..)执行存储过程其返回值只有两种情况(1)假如通过查询分析器执行该存储过程,在显示栏中假如有影响的行数,则影响几行count 就是几(2)假如通过查询分析器执行该存储过程,在显示栏中假如显示'命令已成功完成。

'则count = -1;在显示栏中假如有查询结果,则count = -1总结:A.ExecuteNonQuery()该方法只返回影响的行数,假如没有影响行数,则该方法的返回值只能是-1,不会为0。

B.不论ExecuteNonQuery()方法是按照CommandType.StoredProcedure或者CommandType.Text执行,其效果和A一样。

2. 获得存储过程的返回值--通过查询分析器获得(1)不带任何参数的存储过程(存储过程语句中含有return)---创建存储过程CREATE PROCEDURE testReturnASreturn 145GO---执行存储过程DECLARE @RC intexec @RC=testReturnselect @RC---说明查询结果为145(2)带输入参数的存储过程(存储过程语句中含有return)---创建存储过程create procedure sp_add_table1@in_name varchar(100),@in_addr varchar(100),@in_tel varchar(100)asif(@in_name = '' or @in_name is null)return 1elsebegininsert into table1(name,addr,tel) values(@in_name,@in_addr,@in_tel)return 0end---执行存储过程<1>执行下列,返回1declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count<2>执行下列,返回0declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count---说明查询结果不是0就是1(3)带输出参数的存储过程(存储过程中可以有return可以没有return)例子A:---创建存储过程create procedure sp_output@output int outputasset @output = 121return 1---执行存储过程<1>执行下列,返回121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回1declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明有return,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为return返回的值例子B:---创建存储过程create procedure sp_output@output int outputasset @output = 121---执行存储过程<1>执行下列,返回121declare @out intexec sp_output @out outputselect @out<2>执行下列,返回0declare @out intdeclare @count intexec @count = sp_output @out outputselect @count---说明没有return,只要查询输出参数,则查询结果为输出参数在存储过程中最后变成的值;只要不查询输出参数,则查询结果为0总结:(1)存储过程共分为3类:A.返回记录集的存储过程其执行结果是一个记录集,例如:从数据库中检索出符合某一个或几个条件的记录B.返回数值的存储过程(也可以称为标量存储过程)-----其执行完以后返回一个值,例如:在数据库中执行一个有返回值的函数或命令C.行为存储过程用来实现数据库的某个功能,而没有返回值,例如:在数据库中的更新和删除操作(2)含有return的存储过程其返回值为return返回的那个值(3)没有return的存储过程,不论执行结果有无记录集,其返回值是0(4)带输出参数的存储过程:假如有return则返回return返回的那个值,假如要select输出参数,则出现输出参数的值,于有无return无关3.获得存储过程的返回值--通过程序获得SqlParameter[] cmdParms = { .. ,new SqlParameter("@return",SqlDbType.Int)};cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.ReturnValue;或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Output或者cmdParms[cmdParms.Length - 1].Direction = ParameterDirection.Input;得到返回值object bj = cmdParms[cmdParms.Length - 1].Value;。

ef core sqlserver 调用存储过程返回参数

ef core sqlserver 调用存储过程返回参数

在EF Core中,您可以使用`FromSqlRaw`或`FromSqlInterpolated`方法来调用存储过程并获取返回结果。

如果存储过程有输出参数,您需要使用`SqlParameter`来定义这些参数。

以下是一个示例,展示如何在EF Core中调用一个返回整数的存储过程:```csharpusing (var context = new YourDbContext()){// 定义输出参数var outputParameter = new SqlParameter("OutputParameterName", SqlDbType.Int);outputParameter.Direction = ParameterDirection.Output;// 调用存储过程var result = context.Database.ExecuteSqlRaw("EXECUTE YourStoredProcedure @InputParameterValue, @OutputParameterName OUTPUT",new SqlParameter("InputParameterValue", 123), // 输入参数outputParameter); // 输出参数// 获取输出参数的值int outputValue = (int)outputParameter.Value;}```在上面的示例中,`YourDbContext`是您的EF Core上下文,`YourStoredProcedure`是存储过程的名称,`InputParameterValue`是存储过程的输入参数,`OutputParameterName`是存储过程的输出参数。

请注意,返回的`result`是整数值,这代表了SQL Server存储过程执行的结果。

如果存储过程没有返回任何数据,那么`result`将是0。

SQLServer存储过程同时返回分页结果集和总数

SQLServer存储过程同时返回分页结果集和总数

SQLServer存储过程同时返回分页结果集和总数前⾔好长时间没摸数据库了,周末在家写了个报表的存储过程,⼀时间对使⽤存储过程实现分页的同时并计算出记录总数不知道怎么更好的去实现。

按照我们正常的业务逻辑,存储过程数据⾸先是分页,其次接受若⼲查询条件,返回分页结果集的同时还需要返回记录总数给客户端。

我对于这样⼀个业务存储过程总结如下:1、内核层,通常也就是要查询的字段或者要计算的字段,这部分单独拿出来。

2、查询条件层。

如果内核只是查询⼀些字段的话,条件可以放在查询条件层拼接。

如果内核层完全是统计业务逻辑,那么查询条件则必须要放在内核层,像我们常⽤的SUM、GROUPBY 业务。

3、添加分页参数(也就是我们现在多数⽤的ROW_NUMBER添加rn参数)。

存储过程⾥我们⼀般会单独声明每个部分的变量⽤于执⾏时拼接。

存储过程CREATE proc [dbo].[usp_manyidu](@seatno nvarchar(30),@pageIndex int,@pageSize int,@rsCount int out)asbegindeclare @sql nvarchar(max) --拼接内核SQLdeclare @where nvarchar(max)=' where 1=1' --查询条件拼接字符串declare @cols nvarchar(max) --查询字段、计算字段declare @sort nvarchar(50) --排序set @sql=' from dbo.log where seatno is not null and seatno<>'''' group by seatno 'set @cols='seatno,SUM(case when manyidu=0 then 1 else 0 end) as manyi,SUM(case when manyidu=1 then 1 else 0 end) as yiban,SUM(case when manyidu=2 then 1 else 0 end) as bumanyi,SUM(case when manyidu IS null or manyidu='''' then 1 else 0 end) as weipingjia'set @sort='order by seatno'if(@seatno <>'')set @where+=' and seatno='+@seatnodeclare @strSQL nvarchar(max)set @strSQL=N'select * from (select ROW_NUMBER() over('+@sort+') as tmpid,* from( select * from (select '+@cols+@sql+') as tmpTable1'+@where+') as tmpTable2) as tmpTable3' +' where tmpid between '+STR((@pageIndex-1)*@pageSize+1)+' and '+STR(@pageIndex*@pageSize)print @strSQLexec(@strSQL)set @strSQL='select @total=count(*) from (select '+@cols+@sql+') as tmpTable'+@whereprint @strSQLexec sp_executesql @strSQL,N'@total int out',@total=@rsCount outendGO以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

USE[zhuhaioa7-4]
GO
/****** Object: StoredProcedure [dbo].[proc_records] Script Date: 12/26/2014 20:31:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure[dbo].[proc_records]
as
DECLARE@map_table table(r_key varchar(100),r_value varchar(50))
DECLARE@type_id varchar(40)
DECLARE@type_name varchar(50)
DECLARE@project_id varchar(40)
DECLARE@project_name varchar(50)
DECLARE@payTypeMoney numeric(16, 2)
DECLARE@sumPayTypeMoney numeric(16, 2)
BEGIN
set@payTypeMoney= 0
set@sumPayTypeMoney= 0
--查询项目列表
DECLARE project_cursor CURSOR for select ep_id,ep_name from AB_engineeringPhase where account_id='2' open project_cursor
fetch next from project_cursor into@project_id,@project_name
while@@FETCH_STATUS= 0
begin
--查询项目支付类别
DECLARE projectType_cursor CURSOR for select id,name from T_DataItem where typeId='payType'order by sort asc
open projectType_cursor
fetch next from projectType_cursor into@type_id,@type_name
while@@FETCH_STATUS= 0
begin
--业务逻辑处理处理内层游标
--获取一个项目某一项支付类型的数据
--查询一个项目某一支付类别金额
select@payTypeMoney=sum(checkProjectPayMoney)from JiLiangZhiFu where projectId=@project_id and payType=@type_id group by payType
--一个项目某一支付类别金额存入
insert into@map_table values(@project_id+','+@type_id,@payTypeMoney)
--一个项目累计支付类别金额
set@sumPayTypeMoney=@sumPayTypeMoney+@payTypeMoney
--一个项目某一支付类别金额重置为
set@payTypeMoney= 0
fetch next from projectType_cursor into@type_id,@type_name--内层游标向下移动一行
end
--插入某一项目各个支付类别的金额合计
insert into@map_table values(@project_id,@sumPayTypeMoney)
set@sumPayTypeMoney= 0
close projectType_cursor
deallocate projectType_cursor
fetch next from project_cursor into@project_id,@project_name--内层游标处理结束后,外层游标才继续向下移动一行
end
close project_cursor
deallocate project_cursor
select*from@map_table
END
public Map getProjectPayMoneyByPayType() {
try {
return (Map)this.getHibernateTemplate().execute(
new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException { Connection con = session.connection();
Statement stmt = con.createStatement();
CallableStatement cs = con.prepareCall("{call proc_records}");
//ResultSet rs = stmt.executeQuery("{call proc_records}");
ResultSet rs = cs.executeQuery();
Map map = new HashMap();
while (rs.next()) {
map.put(rs.getString(1), rs.getString(2));
}
rs.close();
stmt.close();
return map;
}
}
);
} catch ( org.springframework.dao.DataAccessException e) { throw new DataAccessException(e.getMessage(),e);
}
}。

相关文档
最新文档