一个复杂的存储过程问题 顶者有分 没有分了 大家帮忙啊

javabuilder9 2008-05-06 08:42:21
这样一个问题 存储过程输入一个字符串 @list @list的值为1,2,3 或者1,2,4,或者1,6,9。。。。。。

然后根据@list的值 分别取表T_CheckTable的值,例如 @List=1,2,3

则分别取T_CheckTable的ID为1,2,3的值
T_CheckTable的字段为


则取ID=1 tablelist=1,2,4,5
ID=2 .........=1,2,5,7,9
ID=3 ..........=1,2,8,9,12

然后组合 tablelist 取其中的唯一值
...全文
174 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ReyZhang 2008-05-06
  • 打赏
  • 举报
回复
呵呵,上面写的好像有错误,更正如下



SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: zhangl
-- Create date: 2008-5-6
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE ProcTest_Proc
@list varchar(1000)
AS
BEGIN

SET NOCOUNT ON

Declare @tablelist varchar(8000)
set @tablelist=N''

--根据id组合tablelist列的所有值
select @tablelist=@tablelist+tablelist+',' from T_CheckTable where id in (select * from dbo.Split_Fun(@list,','))

--定义表变量
Declare @t table(tableid varchar(10))


--将分割后的字符存放的表变量中
insert into @t
select * from dbo.Split_Fun(@tablelist,',')

--去掉重复的,取其中的唯一值,并插入到临时表#temp
select distinct tableid into #temp from @t

--组合字符串
Declare @id varchar(1000)
set @id=N''
select @id=@id+tableid+',' from #temp
set @id=substring(@id,len(@id)) --去掉最后的,

drop table #temp

--显示结果
select @id

END
GO
地下室小红叔 2008-05-06
  • 打赏
  • 举报
回复
写完了 楼主试试
create table T_checkTable
(
id int identity(1,1),
tableList varchar(50) default('1,')
)

insert into t_checktable values('1,2,5,9,')
insert into t_checktable values('1,3,4,9,')
insert into t_checktable values('1,3,4,8,10')
insert into t_checktable values('1,7,11,')

declare @list varchar(100),@temp varchar(10),@temp2 varchar(10),@tempList varchar(500),@result varchar(5000)
set @result=''
set @list='1,3,4,8,15' --设为传入的值
set @list=case when right(@list,1)=',' then @list else @list+',' end --给末尾非逗号结尾的字符串附加逗号
while charindex(',',@list)>0
begin
set @temp=substring(@list,1,charindex(',',@list)-1)
select @tempList=tableList from t_checkTable where [id]=@temp
set @tempList=case when right(@tempList,1)=',' then @tempList else @tempList+',' end
while charindex(',',@tempList)>0
begin
set @temp2=substring(@tempList,1,charindex(',',@tempList)-1)
set @result=case when len(@temp2)>0 and charindex(@temp2,@result)=0 then @result+@temp2+',' else @result end
set @tempList=substring(@tempList,charindex(',',@tempList)+1,len(@tempList))
end
set @list=substring(@list,charindex(',',@list)+1,len(@list))
end
print @result


运行结果为:
1,2,5,9,3,4,8,10,7,11,
ReyZhang 2008-05-06
  • 打赏
  • 举报
回复

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: zhangl
-- Create date: 2008-5-6
-- Description: <Description,,>
-- =============================================
CREATE PROCEDURE ProcTest_Proc
@list varchar(1000)
AS
BEGIN

SET NOCOUNT ON

Declare @tablelist varchar(8000)
set @tablelist=N''

--根据id组合tablelist列的所有值
select @tablelist=@tablelist+tablelist+',' from T_CheckTable where id in (select * from dbo.Split_Fun(@list,','))

--定义表变量
Declare @t table(tableid varchar(10))


--将分割后的字符存放的表变量中
insert into @t
select * from dbo.Split_Fun(@tablelist,',')

--去掉重复的,取其中的唯一值
Declare @id varchar(1000)
select @id=@id+distinct(tableid)+',' from @t


--取唯一值
select @id

END
GO



其中用到一个分割串的函数 dbo.Split_Fun() ,函数如下







--添加表值函数
-- =============================================
-- Author: zhangl
-- ALTER date: 2008-1-14
-- Description: 实现split功能 的函数
-- Test: select dbo.Split_Fun(regionid,',') from userauthority where userno=36
-- =============================================
create function dbo.Split_Fun(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(a varchar(100))

as
begin
declare @i int
set @SourceSql=rtrim(ltrim(@SourceSql))
set @i=charindex(@StrSeprate,@SourceSql)
while @i>=1
begin
insert @temp values(left(@SourceSql,@i-1))
set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
set @i=charindex(@StrSeprate,@SourceSql)
end
if @SourceSql<>''
insert @temp values(@SourceSql)
return
end


lz试试吧
javabuilder9 2008-05-06
  • 打赏
  • 举报
回复
则取ID=1 tablelist=1,2,4,5
ID=2 .........=1,2,5,7,9
ID=3 ..........=1,2,8,9,12

然后组合 tablelist 取其中的唯一值 意思是 tablelist=1,2,4,5 +1,2,5,7,9 +1,2,8,9,12
然后 再取这些组合的tablelist=1,2,4,5,7,9,12
datahandler2 2008-05-06
  • 打赏
  • 举报
回复
看你哪个是你强项。你就用那个先处理成简单的。比如说你SQL比较不会,那你就先用.net处理。再交给SQL。
复杂问题简单化。很有必要
wzq6511 2008-05-06
  • 打赏
  • 举报
回复
http://space.flash8.net/space/html/13/18713_itemid_343495.html
lovehongyun 2008-05-06
  • 打赏
  • 举报
回复
4楼.你确定楼主想这样??

lovehongyun 2008-05-06
  • 打赏
  • 举报
回复
没看明白..
wzq6511 2008-05-06
  • 打赏
  • 举报
回复
用临时表作为数组
create function f_split(@c varchar(2000),@split varchar(2))
returns @t table(col varchar(20))
as
begin

while(charindex(@split,@c)<>0)
begin
insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))
set @c = stuff(@c,1,charindex(@split,@c),'')
end
insert @t(col) values (@c)
return
end
go

select * from dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk',',')

drop function f_split
col
--------------------
dfkd
dfdkdf
dfdkf
dffjk

(所影响的行数为 4 行)



地下室小红叔 2008-05-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 javabuilder9 的帖子:]
然后组合 tablelist 取其中的唯一值
[/Quote]

你是指它的值取相或关系后的结果是不?
live_7sky 2008-05-06
  • 打赏
  • 举报
回复
说得不够清楚
javabuilder9 2008-05-06
  • 打赏
  • 举报
回复
T_CheckTable的字段为
ID TableList
1 1,2,4,5
2 1,2,5,7,9
3 1,2,8,9,12

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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