循环查询的存储过程?高手请进,在线等

废话很多 2008-01-09 12:48:36
传递字符串参数:@CostItem,@BlockID
@CostItem 格式形为:"物业管理费,空调费,电费" 等,中间用'格开
@BlockID 格式形为:"A区,B区,C区" 等,中间用'格开
Stall表结构:
房号,面积,区块
----------------------------------
假如输入@CostItem为物业管理费,空调费
@BlockID为A区,B区
现在要求做一个存储过程,把stall表的房间号查出,并根据输入的参数,得到如下的一个数据格式:
(金额全部默认为0)
房号 面积 区块 费用类型 金额
A001 8.0 A区 物业管理费 0
A001 8.0 A区 空调费 0
A002 10.0 A区 物业管理费 0
A002 10.0 A区 空调费 0
A001 8.0 B区 物业管理费 0
B001 8.0 B区 空调费 0
B002 10.0 B区 物业管理费 0
B002 10.0 B区 空调费 0

怎么写这个存储过程
CREATE PROCEDURE dbo.GetStallCostStartData
(

@CostItem nVARCHAR(200),
@BlockID nVARCHAR(200)
)
as
SET NOCOUNT ON

BEGIN
SELECT FROM dbo.Stall ---怎么写这个存储过程

...全文
58 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
子陌红尘 2008-01-09

CREATE PROCEDURE dbo.GetStallCostStartData
@CostItem nVARCHAR(400),
@BlockID nVARCHAR(400)
AS
BEGIN
SET NOCOUNT ON

SELECT @BlockID =''''+replace(@BlockID , ',' , ''',''')+''''
@CostItem=''''+replace(@CostItem , ',' , ''',''')+''''

EXEC('SELECT * FROM dbo.Stall WHERE 区块 in('+@BlockID+') and 费用类型 in('+@CostItem+')')
END
GO
回复
kk19840210 2008-01-09
CREATE TABLE #TAB(房号 varchar(4),面积 float, 区块 varchar(10))

insert into #tab values('A001',8.0,'A区')

insert into #tab values('A002',10.0,'A区')

insert into #tab values('A001',10.0,'B区')
insert into #tab values('B001',8.0,'B区')
i



create PROCEDURE dbo.GetStallCostStartData
(

@CostItem nVARCHAR(200),
@BlockID nVARCHAR(200)
)
as
BEGIn
create table #t (CostItem varchar(10))
declare @sql varchar(1000)
select @sql=replace(@CostItem,',',''' union all select ''')
exec('insert into #t select '''+@sql+'''')
select a.*,b.*,金额=0 from #tab a ,#t b where charindex(','+a.区块+',',','+@BlockID+',')>0
drop table #t
end


exec GetStallCostStartData '物业管理费,空调费','A区,B区'


房号 面积 区块 CostItem 金额
---- ---------------------- ---------- ---------- -----------
A001 8 A区 物业管理费 0
A001 8 A区 空调费 0
A002 10 A区 物业管理费 0
A002 10 A区 空调费 0
A001 10 B区 物业管理费 0
A001 10 B区 空调费 0
B001 8 B区 物业管理费 0
B001 8 B区 空调费 0
B002 10 B区 物业管理费 0
B002 10 B区 空调费 0

(10 行受影响)
回复
冷箫轻笛 2008-01-09

--建立测试表
create table Stall
(
房号 varchar(4),
面积 int,
区块 varchar(10)
)
insert into Stall select 'A001', 8.0 , 'A区'
insert into Stall select 'A002', 10.0, 'A区'
insert into Stall select 'B001', 8.0 , 'B区'
insert into Stall select 'B002', 10.0 , 'B区'
--建立辅助表
create table tab
(
CoseItem nvarchar(20)
)

--语句(楼主把变量改成参数就可以了)
declare @CostItem nVARCHAR(200)
declare @BlockID nVARCHAR(200)

select @CostItem = '物业管理费,空调费,电费',@BlockID = 'A区,B区,C区'

select @CostItem = 'insert into tab select '''+replace(@CostItem,',',''' union all select ''') + ''''

exec(@CostItem)

select a.房号,a.面积,a.区块,b.CoseItem as 费用类型,0 as 金额
from Stall a ,tab b
where @BlockID like '%'+a.区块+'%'

--结果

(所影响的行数为 3 行)

房号 面积 区块 费用类型 金额
---- ----------- ---------- -------------------- -----------
A001 8 A区 物业管理费 0
A001 8 A区 空调费 0
A001 8 A区 电费 0
A001 8 A区 物业管理费 0
A001 8 A区 空调费 0
A001 8 A区 电费 0
A002 10 A区 物业管理费 0
A002 10 A区 空调费 0
A002 10 A区 电费 0
A002 10 A区 物业管理费 0
A002 10 A区 空调费 0
A002 10 A区 电费 0
B001 8 B区 物业管理费 0
B001 8 B区 空调费 0
B001 8 B区 电费 0
B001 8 B区 物业管理费 0
B001 8 B区 空调费 0
B001 8 B区 电费 0
B002 10 B区 物业管理费 0
B002 10 B区 空调费 0
B002 10 B区 电费 0
B002 10 B区 物业管理费 0
B002 10 B区 空调费 0
B002 10 B区 电费 0

(所影响的行数为 24 行)


--删除辅助表数据
truncate table tab
回复
子陌红尘 2008-01-09
之前的SP有误,修正如下:


CREATE TABLE Stall(房号 varchar(10),面积 int,区块 varchar(10))
INSERT INTO Stall VALUES('A001', 8,'A区')
INSERT INTO Stall VALUES('A001', 8,'B区')
INSERT INTO Stall VALUES('A002',10,'A区')
INSERT INTO Stall VALUES('A002',10,'B区')
INSERT INTO Stall VALUES('A003',12,'A区')
INSERT INTO Stall VALUES('A003',12,'B区')
GO

CREATE PROCEDURE dbo.GetStallCostStartData
@CostItem nVARCHAR(400),
@BlockID nVARCHAR(400)
AS
BEGIN
SET NOCOUNT ON
DECLARE @SQL NVARCHAR(4000)

SELECT @BlockID =''''+REPLACE(@BlockID , ',' , ''',''')+'''',
@CostItem=@CostItem + ',',@SQL=''

WHILE charindex(',',@CostItem)>0
BEGIN
SELECT @SQL=@SQL+' UNION ALL SELECT 房号,面积,区块,'''
+LEFT(@CostItem,charindex(',',@CostItem)-1)
+''' as 费用类型,0 as 金额 FROM dbo.Stall WHERE 区块 in('+@BlockID+')',
@CostItem=stuff(@CostItem,1,charindex(',',@CostItem),'')
END

SET @SQL=STUFF(@SQL,1,10,'')+ 'ORDER BY 区块,费用类型'
EXEC(@SQL)
END
GO

EXEC GetStallCostStartData '物业管理费,空调费,电费','A区,B区'
GO

/*
房号 面积 区块 费用类型 金额
---------- ----------- ---------- ---------- -----------
A001 8 A区 电费 0
A002 10 A区 电费 0
A003 12 A区 电费 0
A002 10 A区 空调费 0
A003 12 A区 空调费 0
A001 8 A区 空调费 0
A003 12 A区 物业管理费 0
A001 8 A区 物业管理费 0
A002 10 A区 物业管理费 0
A002 10 B区 电费 0
A001 8 B区 电费 0
A003 12 B区 电费 0
A003 12 B区 空调费 0
A002 10 B区 空调费 0
A001 8 B区 空调费 0
A003 12 B区 物业管理费 0
A002 10 B区 物业管理费 0
A001 8 B区 物业管理费 0
*/

DROP PROCEDURE dbo.GetStallCostStartData
DROP TABLE Stall
GO
回复
kk19840210 2008-01-09

CREATE TABLE #TAB(房号 varchar(4),面积 float, 区块 varchar(10), 费用类型 varchar(10) ,金额 int)

insert into #tab values('A001',8.0,'A区','物业管理费',0)

insert into #tab values('A001',8.0,'A区','空调费',0)

insert into #tab values('A002',10.0,'A区','物业管理费',0)

insert into #tab values('A002',10.0,'A区','空调费',0)

insert into #tab values('A001',8.0,'b区','物业管理费',0)

insert into #tab values('A001',8.0,'b区','空调费',0)

insert into #tab values('A002',10.0,'b区','物业管理费',0)

insert into #tab values('A002',10.0,'b区','空调费',0)

insert into #tab values('A003',8.0,'b区','物业管理费',0)

insert into #tab values('A003',8.0,'b区','空调费',0)

insert into #tab values('A003',10.0,'a区','电费',0)

insert into #tab values('A003',10.0,'c区','空调费',0)

insert into #tab values('A002',10.0,'c区','物业管理费',0)


CREATE PROCEDURE dbo.GetStallCostStartData
(

@CostItem nVARCHAR(200),
@BlockID nVARCHAR(200)
)
as
BEGIn
exec('select * from #tab where charindex('',''+区块+'','','',''+'''+@BlockID+'''+'','')>0 and charindex('',''+费用类型+'','','',''+'''+@CostItem+'''+'','')>0')
end

exec GetStallCostStartData '物业管理费,空调费','A区,B区'



房号 面积 区块 费用类型 金额
---- ---------------------- ---------- ---------- -----------
A001 8 A区 物业管理费 0
A001 8 A区 空调费 0
A002 10 A区 物业管理费 0
A002 10 A区 空调费 0
A001 8 b区 物业管理费 0
A001 8 b区 空调费 0
A002 10 b区 物业管理费 0
A002 10 b区 空调费 0
A003 8 b区 物业管理费 0
A003 8 b区 空调费 0

(10 行受影响)
回复
子陌红尘 2008-01-09
CREATE PROCEDURE dbo.GetStallCostStartData 
@CostItem nVARCHAR(400),
@BlockID nVARCHAR(400)
AS
BEGIN
SET NOCOUNT ON
DECLARE @SQL NVARCHAR(4000)

SELECT @BlockID =''''+replace(@BlockID , ',' , ''',''')+''''
@CostItem=@CostItem + ',',@SQL=''

WHILE charindex(',',@CostItem)>0
BEGIN
SELECT @SQL=@SQL+' UNION ALL SELECT 房号,面积,区块,'''+left(@CostItem,charindex(',',@CostItem)-1)+''' as 费用类型,0 as 金额 from dbo.Stall WHERE 区块 in('+@BlockID+')'
@CostItem=stuff(@CostItem,1,charindex(',',@CostItem),'')
END

EXEC(@SQL)
END
GO
回复
废话很多 2008-01-09
to:libin_ftsafe
不对啊,我需要查出是这样的表结构
房号 面积 区块 费用类型 金额
而dbo.Stall只有字段:"房号 面积 区块",没有 "费用类型 金额 "字段. 金额可以默认为零
如何做?
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2008-01-09 12:48
社区公告
暂无公告