SQL Server2008怎样写这样一个存储过程?

nightgoblin 2012-04-13 09:29:50
我现在有个b表,表结构如下(b2中A代表10,B代表11,C代表12):
b1 b2
1 1,2,3,4,5,6,7,8,9,A,B,C

然后我创建另外一个表c,想将b表中b1和b2数据插入进去,表结构如下:
c1 c2
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
.......

基础数据源码

IF OBJECT_ID('b') IS NOT NULL
DROP TABLE b;
GO
IF OBJECT_ID('c') IS NOT NULL
DROP TABLE a;
GO
--创建b表
CREATE TABLE b
( b1 INT , --产品ID
b2 VARCHAR(50) --产品合同月份
);
--插入数据
INSERT INTO b VALUES (1,'1,2,3,4,5,6,7,8,9,A,B,C');

GO
--创建c表
CREATE TABLE c
(c1 INT,--产品ID
c2 INT --产品月份);


请问高手,这个存储过程怎样写?
...全文
136 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightgoblin 2012-04-13
  • 打赏
  • 举报
回复
高手快来啊,在线等!!!
寂小魔 2012-04-13
  • 打赏
  • 举报
回复
其实 12点之前我看到这个贴,正在思考 奈何下班了,就去吃饭了 回来做了点事 再上来看 就发现你自己搞定了,其实我是菜鸟,在csdn学习的。
nightgoblin 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
友情顶帖,学习中
[/Quote]
你是第一个回复此贴的人,我把分都送你好了。
nightgoblin 2012-04-13
  • 打赏
  • 举报
回复
谁还有更好的方法呢?
nightgoblin 2012-04-13
  • 打赏
  • 举报
回复
哎,算了我自问自答好了。

USE tempdb;
GO
IF OBJECT_ID('spInsc') IS NOT NULL
DROP PROCEDURE spInsc;
GO
CREATE PROCEDURE spInsc
AS
BEGIN
DECLARE @m CHAR(5),--b2中提取的字符串
@b1 INT ,
@b2 VARCHAR(50),--产品合同月份
@n INT,--b2中字符串间隔
@nc INT --b2中字符串的数量
DECLARE cur CURSOR FOR SELECT DISTINCT b1,b2 FROM b;
OPEN cur;
FETCH NEXT FROM cur INTO @b1,@b2;
WHILE @@FETCH_STATUS=0
BEGIN
/*查找b2中字符串的数量*/
SELECT @nc=LEN(b2) FROM b WHERE b1=@b1;
SET @n=1;
WHILE @n<=@nc
BEGIN
SET @m=SUBSTRING(@b2,@n,1);
INSERT INTO c
VALUES (@b1,
CASE @m
WHEN 'A' THEN '10'
WHEN 'B' THEN '11'
WHEN 'C' THEN '12'
ELSE @m END);
SET @n=@n+2;
END;
FETCH NEXT FROM cur INTO @b1,@b2;
END;
CLOSE cur;
DEALLOCATE cur;
END;

还可以这样写:

USE tempdb;
GO
/****** Object: StoredProcedure [dbo].[InsertToTablec] Script Date: 04/13/2012 11:19:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
------------------------------------
--用途:
------------------------------------
Create PROCEDURE [dbo].[InsertToTablec]

AS
begin tran
declare @error int
set @error=0
declare T1 cursor for select b1,b2 from dbo.b
declare @b1 int,@b2 varchar(50)
open T1
fetch next from T1 into @b1,@b2
while @@FETCH_STATUS=0
begin
declare @id varchar(300),@m int,@n int ,@count int
set @m=CHARINDEX(',',@b2)
set @n=1
set @count=0
WHILE @m>0
BEGIN
set @id=substring(@b2,@n,@m-@n)

insert into c (c1,c2) values ( @b1,case @id when 'A' then '10' when 'B' then '11' when 'C' then '12' else @id end)


set @error=@error+@@ERROR
set @n=@m+1
set @m=CHARINDEX(',',@b2,@n)
END

if(@n<LEN(@b2)+1)
begin
set @id=SUBSTRING(@b2,@n,LEN(@b2)-@n+1)

insert into c (c1,c2) values ( @b1,case @id when 'A' then '10' when 'B' then '11' when 'C' then '12' else @id end)

end


fetch next from T1 into @b1,@b2
end
close T1
deallocate T1

--提交
if @error=0
begin
commit tran
end
else
begin
rollback tran
end

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧