SQL Server 存储过程--传递数组、使用循环

Sqlserver存储过程—----传递数组、使用循环   Sqlserver 存储过程 数组 循环 背景: 前一段时间做过一个公司内部的员工项目管理系统,其间有个sqlserver存储过程是要从excel文件中读取员工的项目信息,并从db中找出相关的的其他信息插入到一张员工表中。这里涉及两个难点:怎么向存储过程传递多条记录?在存储过程中怎么对这些记录一条条循环处理。

解决方案: 1.      怎么将excel中数据传入到存储过程中? 存储过程是没有办法接受数组参数的,我的做法是先把excel中的信息导入到一张全局的临时表中,在把临时表的表名传递给存储过程,在存储过程中使用临时表内容。

2.      怎么在存储过程中做循环处理? 在存储过程中新建一张临时表,将传递过来的全局临时表的信息保存在该表中,并且在表中添加一个id列,对记录从一开始计数。使用count函数计算记录的个数,使用while语句对id从1到count进行循环

代码:

1.创建临时表:

IF OBJECT_ID('dbo.create_tempTable') IS NOT NULL     DROP PROC dbo.create_tempTable; GO CREATE PROC dbo.create_tempTable     AS       CREATE TABLE ##tempexcel(         pjid char(6),--项目id         userid char(6),--用户id         PRIMARY KEY(pjid, userid)     )    GO

2.具体操作的存储过程:

IF OBJECT_ID('dbo.Staff_insert') IS NOT NULL     DROP PROC dbo.Staff_insert; GO CREATE PROC dbo.Staff_insert     @temptableName nvarchar(20)--临时表名 AS BEGIN     --用于实现循环的临时表,intID列用于从1开始对记录计数     CREATE TABLE #excelData(intID int identity(1,1),pjid char(6),userid char(6));     --将全局临时表中的数据插入到临时表中     INSERT INTO #excelData(pjid,userid) EXEC('SELECT pjid, userid FROM '+ @temptableName);     --计算记录的个数     SELECT @count= COUNT(1) FROM #excelData;     --如果记录存在,进入循环     IF(@count > 0)     BEGIN         SET @i = 1;--循环变量                        WHILE(@i <= @count)         BEGIN             -- 根据intid取出要操作的记录             SELECT @pjid=pjid,@userid=userid FROM #excelData WHERE intID = @i;             --其他操作             --             --         END     END END 想把一个数据表里的某个字段筛选出来然后,循环的把值传给另一个存储过程,选择使用了临时表。 SQL代码如下: CREATE TABLE #Temp_TABLE ( ID INT IDENTITY(1,1), TRANSID VARCHAR(30), --出库单号 PRIMARY KEY (ID) ) INSERT INTO #Temp_TABLE SELECT TRANSID FROM A WHERE A.RPID='RP00913031200001'--从A表取出符合条件的数据插入到临时表 DECLARE @TOTAL_COUNT INT,--临时表记录条数 @NOW_COUNT INT,--现在遍历到哪条记录 @TRID VARCHAR(30)--当前遍历的transid SELECT @TOTAL_COUNT=COUNT(*) FROM #Temp_TABLE SET @NOW_COUNT=1; WHILE(@NOW_COUNT<=@TOTAL_COUNT)  BEGIN    SELECT @TRID=TRANSID FROM #Temp_TABLE    WHERE ID=@NOW_COUNT --关键就在这(一切都因这个地方而不一样了哦)    EXEC proc_monprocess @TRID--传给另一个存储过程    SET @NOW_COUNT=@NOW_COUNT+1  END DROP TABLE #Temp_TABLE 有关表的数据插入 1、把临时表中的数据插入到另一个表中 insert into 表 select * from #temp 2、把一个表中字段复制到临时表中 select * into #temp from   表 where ... 3、本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的; 4、当用户从 SQL Server 实例断开连接时被删除。 5、判断临时表是否存在 create proc temp(@tablename varchar(200)) as begin declare @exec varchar(8000) set @exec='use tempdb if exists(select * from sysobjects where id=object_id(''tempdb..'+@tablename+''')) select ''存在'' else select ''不存在''' exec (@exec) end

--计算一段时间内工作的天数

select dbo.f_workday('2014-06-01','2014-07-30')

create function  f_workday(

-- 参数

@date_begin datetime, --计算开始日期

@date_end datetime )  --计算结束日期

returns int  -- 返回值数据类型

as

begin

   declare  @weeks  int,  -- 声明变量

            @workday int

-- SQL语句(必须有return 变量或值)

---计算整周的工作天数

 select  @weeks=(datediff (day ,@date_begin, @date_end)+1)/7,     -- 计算开始和结束日期的之间的周数(完整的周)

         @workday=@weeks*5,                                       --整周的工作天数----

         @date_begin=dateadd(day,@weeks*7,@date_begin)            --最後一个不完整的周的工作天数

   while  @date_begin<=@date_end

   begin

select @workday = case when (@@datefirst+datepart(weekday,@date_begin)-1)%7 between 1 and 5 then @workday+1

else @workday+1 end, @date_begin =@date_begin+1

end

return (@workday)

end

demo2:

-- 根据 questionID  查询 pName

create FUNCTION [dbo].[getPointNameByQuestionID](@questionID INT)

RETURNs varchar(256)

AS

BEGIN

   DECLARE @pName VARCHAR(256)

   SELECT DISTINCT TOP 1 @pName = p.pointName

FROM EXPORT_POINT_QUESTION_DHY pq

LEFT JOIN QZ_POINT p ON pq.pointID = p.pointID

WHERE pq.questionID = @questionID

   RETURN ISNULL(@pName , '其他' )

END

GO

select dbo.getPointNameByQuestionID(123);

demo3:

-----比较两个值大小,返回小的----

create FUNCTION [dbo].[getMin]

(

   @num1 int,

   @num2 int

)

RETURNS int

as

BEGIN

declare @num int

if @num1>@num2

begin

set @num=@num2

end

else

begin

set @num=@num1

end

return @num

END

GO

   

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容