`
maiguang
  • 浏览: 262525 次
  • 性别: Icon_minigender_1
  • 来自: 焦作
社区版块
存档分类
最新评论

Sql存储过程中临时表和游标的使用

阅读更多

create Procedure sp_getpricelist
(
@m_strPID varchar(1000)
)
as
begin
 --region 创建临时表
 IF object_id('tempdb..##ThisIsATest') is not null
 begin
  drop table ##ThisIsATest
 end
 CREATE TABLE ##ThisIsATest
 (
  ID int Primary Key,     --经销商报价产品ID
  PID bigint,       --产品ID
  Province nvarchar(100) default(''), --省份
  City nvarchar(100) default(''),  --城市
  Price money default(0.00)   --价格 
  --其它字段忽略 
 )

 --endregion 创建临时表结束
 declare @m_lPriceId bigint

 declare @SplitArray table(ID bigint Primary Key)
 
 declare @tempIndex int
 set @tempIndex=1 
 if charindex(',',@m_strPID)=0
 begin
  insert into @SplitArray values(Convert(bigint,@m_strPID))
  set @tempIndex=0
 end
 while @tempIndex>0
 begin
  set @tempIndex=charindex(',',@m_strPID)
  print @tempIndex
  if @tempIndex>0
  begin
   insert into @SplitArray values(Convert(bigint,substring(@m_strPID,1,@tempIndex-1)))
   set @m_strPID=substring(@m_strPID,@tempIndex+1,datalength(@m_strPID)-@tempIndex)
   if charindex(',',@m_strPID)=0
   begin
    insert into @SplitArray values(Convert(bigint,@m_strPID))
   end
  end
 end
 --select * from @SplitArray
 declare p_cursor1 cursor for select ID from @SplitArray
 open p_cursor1
 fetch next from p_cursor1 into @m_lPriceId
 declare @loopi1 int
 set @loopi1=1 --设置计数器
 while @@FETCH_STATUS = 0
 begin
  
  declare @m_pCursorId int --循环指针
  declare @strsql nvarchar(4000)

  declare @ParamName varchar(100)
  declare @PValue nvarchar(4000)

  declare @Province nvarchar(100)
  declare @City nvarchar(100)
  declare @Price money
  declare @PID bigint
  
  insert into ##ThisIsATest(ID) values(@m_lPriceId)
  declare p_cursor cursor for select B.ID from T_Product_PriceInfo A,T_Product_Param_Value B,T_Cate_Param C,T_Product_Quote D where D.ID=@m_lPriceId and A.ID=B.P_ID and B.C_ID=C.ID and A.ID=D.P_ID
  open p_cursor
  fetch next from p_cursor into @m_pCursorId
  declare @loopi int
  set @loopi=1 --设置计数器
  while @@FETCH_STATUS = 0
  begin
   select
   @PID=A.ID,
   @ParamName=C.ParamName,@Province=D.Province,@City=D.City,@Price=D.Price,
   @PValue =
   case
   when (C.ValueType>0 and C.ValueType<11) then Convert(nvarchar(4000),B.S_Value)
   when (C.ValueType>10 and C.ValueType<21) then Convert(nvarchar(4000),B.I_Value)
   when (C.ValueType>20 and C.ValueType<31) then Convert(nvarchar(4000),B.D_Value)
   end
   from T_Product_PriceInfo A,T_Product_Param_Value B,T_Cate_Param C,T_Product_Quote D
   where
   D.ID=@m_lPriceId and A.ID=D.P_ID and
   A.ID=B.P_ID and B.C_ID=C.ID and B.ID=@m_pCursorId
   if col_length('tempdb..##ThisIsATest',@ParamName) is null
   begin
    set @strsql='Alter table ##ThisIsATest add '+@ParamName+' nvarchar(4000)'
    Exec(@strsql)
   end
   set @strsql ='update ##ThisIsATest set '+@ParamName+'='''+@PValue+''','
   set @strsql=@strsql+' PID='+Convert(nvarchar(10),@PID)+','
   set @strsql=@strsql+' Province='''+@Province+''','
   set @strsql=@strsql+' City='''+@City+''','
   set @strsql=@strsql+' Price=convert(money,'''+Convert(nvarchar(10),@Price)+''')'
   --其它字段忽略 
   set @strsql=@strsql+' where ID='+Convert(nvarchar(10),@m_lPriceId)
   Exec(@strsql)
   set @loopi= @loopi+1
   fetch next from p_cursor into @m_pCursorId
  end
  close p_cursor
  DEALLOCATE p_cursor
  set @loopi1= @loopi1+1
  fetch next from p_cursor1 into @m_lPriceId
 end
 close p_cursor1
 DEALLOCATE p_cursor1
 delete from ##ThisIsATest where PID is null
 set @strsql='select * from ##ThisIsATest'
 Exec(@strsql)
 drop table ##ThisIsATest
 --go
 --删除临时表 http://www.shenjk.com/
end
go

sp_getpricelist '1,2,3,4,5,6,7'

分享到:
评论

相关推荐

    SQLSREVER如何创建和使用动态游标

    SQL Server 中创建和使用动态游标的技术要点 在 SQL Server 中,创建和使用动态游标是一种高效的数据处理方式。本文将详细介绍如何创建和使用动态游标,包括存储过程的设计、游标的创建、数据的插入和查询等方面的...

    SQL补充触发器临时表与游标PPT学习教案.pptx

    SQL中的触发器是一种特殊...总的来说,这个PPT学习教案涵盖了SQL中的关键概念,包括触发器、存储过程、临时表和游标,这些都是数据库管理和开发的重要组成部分,对于理解SQL的高级功能和实现复杂的业务逻辑至关重要。

    SqlServer存储过程、游标讲解

    INSENSITIVE类型的游标会将查询结果存放在一个临时表中,这个临时表位于tempdb数据库下,对基本表的修改不会影响游标提取的数据,同样地,通过游标也无法直接更新基本表。而SCROLL类型提供了灵活的数据提取操作,...

    Java调用oracle存储过程通过游标返回临时表

    本篇文章将深入探讨如何使用Java调用Oracle存储过程,并通过游标获取存储过程中返回的临时表数据。 首先,Oracle存储过程是一种在数据库端执行的预编译SQL语句和PL/SQL代码集合。它可以接收参数、执行业务逻辑并...

    SQL Server遍历表中记录的2种方法(使用表变量和游标)

    表变量在SQL Server中是一种临时存储数据的结构,它与临时表相似但作用范围更小,仅限于当前批处理或存储过程。以下是一个使用表变量的例子: ```sql DECLARE @temp TABLE (id INT IDENTITY(1, 1), Name VARCHAR(10...

    Sql Server临时表和游标的使用小结

    - 存储过程中使用的局部临时表也会在过程执行完毕后自动删除,但为了系统维护的清晰度,建议在不再需要时显式地DROP。 **2. 游标** 游标允许数据库应用程序按需逐行处理结果集,而不是一次性返回所有数据。Sql ...

    mysql复杂存储过程实例(游标、临时表、循环、递归)

    本资源结合实例实现一个复杂的存储过程,存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。

    oracle存储过程使用游标对多表操作例子

    本示例展示了在Oracle存储过程中使用游标进行多表操作的复杂性和灵活性。通过这种方式,可以有效地处理大量数据,同时确保数据的一致性和准确性。理解并熟练掌握这些技巧,对于数据库开发者来说是非常宝贵的技能。

    Oracel储存过程用临时表

    以下是一个简单的示例,展示了如何在存储过程中使用临时表返回结果集: ```sql CREATE OR REPLACE PROCEDURE get_data(p_id IN NUMBER, c OUT SYS_REFCURSOR) AS TYPE data_table_type IS TABLE OF your_table%...

    Oracle存储过程游标详解

    Oracle 存储过程游标是指在 Oracle 数据库中使用游标来实现对结果集的处理和操作。游标可以分为静态游标和REF游标两种类型。静态游标是指结果集已经确实(静态定义)的游标,可以进一步分为隐式游标和显示游标。隐式...

    存储过程,要用到指针,临时表

    在数据库管理领域,存储过程是预编译的SQL语句集合,它们被封装在一个单一的逻辑单元中,便于管理和重复使用。存储过程在C#编程中通常与Visual Studio(如VS2005)结合使用,以实现更高效的数据访问和处理。在本话题...

    DB2游标及动态SQL

    - **获取数据(Fetch)**:使用`FETCH cursor_name INTO variable_list`从游标中取出数据到指定的变量列表中。 - **关闭(Close)**:使用`CLOSE cursor_name`来关闭一个已经打开的游标。 **1.3 示例** ```sql ...

    取代游标的方案:使用min()函数或max()函数;用表函数;使用临时表

    本文将深入探讨三种有效的游标替代方案:使用`MIN()`和`MAX()`函数、使用表函数以及使用临时表。 ### 使用`MIN()`和`MAX()`函数 `MIN()`和`MAX()`是SQL中的聚合函数,分别用于返回一列中的最小值和最大值。在游标...

    SQL语句\sql 游标总结

    游标提供了一种从表中检索数据并进行操作的灵活手段,主要用在服务器上,处理由客户端发送给服务器端的 SQL 语句,或是批处理、存储过程、触发器中的数据处理请求。 1. 游标的概念 游标的优点在于它可以定位到结果...

    关于存储过程和游标的总结

    本文主要介绍了游标的概念、类型、状态和使用方法,以及存储过程的相关知识。 一、游标的概念 游标是一种机制,允许应用程序逐行处理结果集,而不是处理整个结果集。游标是通过游标库来实现的,游标库是常常作为...

    SQL Server2000游标例子

    本例中使用了`WHILE`循环来遍历游标中的每一行数据。 ```sql WHILE (@@FETCH_STATUS = 0) BEGIN -- 处理数据... FETCH NEXT FROM MyCursor INTO @ReaderID, @State, @StartTime END ``` 在这个过程中,通过判断`@@...

    sql server 游标实例

    ### SQL Server 游标实例详解 #### 一、游标概念与作用 在SQL Server中,游标是一种数据库对象,允许我们逐行处理查询结果集中...如果可能,尝试使用其他方法如表变量、临时表或者更高效的T-SQL语句来替代游标的使用。

    存储过程:利用游标+临时表实现查询

    本存储过程的目的是利用游标和临时表来实现动态查询,主要用于查询监测设备的状态及目标监测设备状态。下面我们将深入探讨存储过程的使用优势、游标的概念和使用步骤,以及在MySQL中如何实现游标。 1. 存储过程的...

    在Sql Server数据库中利用存储过程实现动态交叉表.pdf

    在Sql Server数据库中,默认情况下不提供交叉表的生成功能,因此需要使用存储过程、游标、临时表和动态SQL等技术来实现交叉表的生成。本文将详细介绍如何使用这些技术来实现交叉表的生成,并结合实例介绍了交叉表在...

Global site tag (gtag.js) - Google Analytics