邹老师请解答!各位高手请解答!

plutu 2004-08-02 09:14:40
我的表中有几个字段,比如说“条目”字段内容是厚度,“字段”数量的内容是2,而表中也有厚度1、厚度2、厚度3字段,还有长度1、长度2、长度3,这些都在一条记录中,我现在的要求是:能否根据条目字段的内容而动态取字段内容?比如说条目字段的内容是“厚度”,那么就取厚度1、厚度2、厚度3的字段内容,如果说条目的内容是“长度”,那么就取长度1、长度2、长度3字段的内容,请问这条SQL语句怎样实现?

...全文
226 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
plutu 2004-08-03
  • 打赏
  • 举报
回复
我在线等您的答案,谢谢!
plutu 2004-08-03
  • 打赏
  • 举报
回复
我是预留了几个字段,因为可能还要有试验项目,我是按照最多的情况预留的
zjcxc 2004-08-03
  • 打赏
  • 举报
回复
为什么到字段9? 是否字段数目是固定的,保是取数是变化的?
plutu 2004-08-03
  • 打赏
  • 举报
回复
序号 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9
-------------------------------------------------------------------------------------------
1 抗拉300 抗拉310 抗拉305 延伸20 延伸30
2 抗拉300 抗拉290 延伸20 延伸25 延伸23 屈服800 屈服802
3 延伸23 延伸22 延伸21 屈服800 屈服805 810
plutu 2004-08-03
  • 打赏
  • 举报
回复
真是不好意思,又占用了你这么多宝贵的时间去建测试表,真是非常感谢!不用函数而直接用SQL语句实现不了吗?要不这样,我重新给你说一下,昨天我说的可能不是很好实现,这样吧,我重新建两个表,一个计划表,内容为试验内容和试验次数,试验内容也不一样,比如说有抗拉强度,延伸率,屈服强度等,次数为该试验内容的试验次数,另一张表对应这次的试验数据,两个表之间有一个试验序号对应,现在的要求是:根据计划表中试验内容和次数从试验数据表中取相应的值,因为计划表是由多个试验项目组成,我的表的结构如下:
--计划表
create table 计划(序号 varchar(2),试验内容1 varchar(10),试验次数1 int,试验内容2 varchar(10),试验次数2 int,试验内容3 varchar(10),试验次数3 int,试验内容4 varchar(10),试验次数4 int,试验内容5 varchar(10),试验次数5 int,试验内容6 varchar(10),试验次数6 int)
insert 计划 select '1','抗拉强度',3,'延伸率',2,'',0,'',0,'',0,'',0
union all select '2','抗拉强度',2,'延伸率',3,'屈服强度',2,'',0,'',0,'',0
union all select '3','延伸率',3,'屈服强度',3,'',0,'',0,'',0,'',0
--试验数据表
create table 数据(序号 varchar(2),抗拉强度1 int,抗拉强度2 int,抗拉强度3 int,延伸率1 int,延伸率2 int,延伸率3 int,屈服强度1 int,屈服强度2 int,屈服强度3 int)
insert 数据 select '1',300,310,305,20,30,0,0,0,0
union all select '2',300,290,0,20,25,23,800,802,0
union all select '3',0,0,0,23,22,21,800,805,810

结果如下:
序号 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9
1 抗拉300 抗拉310 抗拉305 延伸20 延伸30
2 抗拉300 抗拉290 延伸20 延伸25 延伸23 屈服800 屈服802
3 延伸23 延伸22 延伸21 屈服800 屈服805 810
也就是说字段是动态取的
plutu 2004-08-03
  • 打赏
  • 举报
回复
他是大家有目共睹的专家,今年微软MVP非他莫属!
yjr332533 2004-08-03
  • 打赏
  • 举报
回复
邹建真强。
plutu 2004-08-03
  • 打赏
  • 举报
回复
哇,好长哦,我首先谢谢你,我还需要慢慢消化一下才能明白,谢谢!
zjcxc 2004-08-03
  • 打赏
  • 举报
回复
不用自定义函数,就用游标实现函数中的处理

函数中@fieldcount就是你生成的结果表的字段的最大数目

想了一上午,还是没有想出这种动态语句有什么高效的处理方法.
zjcxc 2004-08-03
  • 打赏
  • 举报
回复
--示例

--计划表
create table 计划(序号 varchar(2),试验内容1 varchar(10),试验次数1 int,试验内容2 varchar(10),试验次数2 int,试验内容3 varchar(10),试验次数3 int,试验内容4 varchar(10),试验次数4 int,试验内容5 varchar(10),试验次数5 int,试验内容6 varchar(10),试验次数6 int)
insert 计划 select '1','抗拉强度',3,'延伸率',2,'',0,'',0,'',0,'',0
union all select '2','抗拉强度',2,'延伸率',3,'屈服强度',2,'',0,'',0,'',0
union all select '3','延伸率',3,'屈服强度',3,'',0,'',0,'',0,'',0

--试验数据表
create table 数据(序号 varchar(2),抗拉强度1 int,抗拉强度2 int,抗拉强度3 int,延伸率1 int,延伸率2 int,延伸率3 int,屈服强度1 int,屈服强度2 int,屈服强度3 int)
insert 数据 select '1',300,310,305,20,30,0,0,0,0
union all select '2',300,290,0,20,25,23,800,802,0
union all select '3',0,0,0,23,22,21,800,805,810
go

--创建处理的辅助函数
create function f_sql(
@试验内容1 varchar(10),@试验次数1 int,
@试验内容2 varchar(10),@试验次数2 int,
@试验内容3 varchar(10),@试验次数3 int,
@试验内容4 varchar(10),@试验次数4 int,
@试验内容5 varchar(10),@试验次数5 int,
@试验内容6 varchar(10),@试验次数6 int,
@fieldcount int
)returns varchar(8000)
as
begin
declare @re varchar(8000),@i int,@j int
select @re='',@i=1,@j=1
while @j<=@试验次数1 and @i<=@fieldcount
select @re=@re+',[字段'+cast(@i as varchar)+']='''
+left(@试验内容1,2)+'''+cast(['
+@试验内容1+cast(@j as varchar)+'] as varchar)'
,@i=@i+1,@j=@j+1
set @j=1
while @j<=@试验次数2 and @i<=@fieldcount
select @re=@re+',[字段'+cast(@i as varchar)+']='''
+left(@试验内容2,2)+'''+cast(['
+@试验内容2+cast(@j as varchar)+'] as varchar)'
,@i=@i+1,@j=@j+1
set @j=1
while @j<=@试验次数3 and @i<=@fieldcount
select @re=@re+',[字段'+cast(@i as varchar)+']='''
+left(@试验内容3,2)+'''+cast(['
+@试验内容3+cast(@j as varchar)+'] as varchar)'
,@i=@i+1,@j=@j+1
set @j=1
while @j<=@试验次数4 and @i<=@fieldcount
select @re=@re+',[字段'+cast(@i as varchar)+']='''
+left(@试验内容4,2)+'''+cast(['
+@试验内容4+cast(@j as varchar)+'] as varchar)'
,@i=@i+1,@j=@j+1
set @j=1
while @j<=@试验次数5 and @i<=@fieldcount
select @re=@re+',[字段'+cast(@i as varchar)+']='''
+left(@试验内容5,2)+'''+cast(['
+@试验内容5+cast(@j as varchar)+'] as varchar)'
,@i=@i+1,@j=@j+1
set @j=1
while @j<=@试验次数6 and @i<=@fieldcount
select @re=@re+',[字段'+cast(@i as varchar)+']='''
+left(@试验内容6,2)+'''+cast(['
+@试验内容6+cast(@j as varchar)+'] as varchar)'
,@i=@i+1,@j=@j+1
while @i<=@fieldcount
select @re=@re+',[字段'+cast(@i as varchar)+']='''''
,@i=@i+1
return(@re)
end
go

--调用函数生成处理的SQL语句
declare @s varchar(8000)
set @s=''
select @s=@s+'union all select 序号'
+dbo.f_sql(试验内容1,试验次数1,试验内容2,试验次数2,试验内容3,试验次数3,试验内容4,试验次数4,试验内容5,试验次数5,试验内容6,试验次数6,9)
+' from 数据 where 序号='+序号
from 计划
set @s=stuff(@s,1,10,'')
exec(@s)
go

--删除测试
drop table 计划,数据
drop function f_sql

/*--测试结果

序号 字段1 字段2 字段3 字段4 字段5 字段6 字段7 字段8 字段9
-- -------- ------- -------- -------- ------- -------- -------- ------ ------
1 抗拉300 抗拉310 抗拉305 延伸20 延伸30
2 抗拉300 抗拉290 延伸20 延伸25 延伸23 屈服800 屈服802
3 延伸23 延伸22 延伸21 屈服800 屈服805 屈服810
--*/
zjcxc 2004-08-02
  • 打赏
  • 举报
回复
--还是看得不明白

--你不举例我举倒吧(晕)

--调试表
create table 调度(试验内容 varchar(10),试验次数 int)
insert 调度 select '抗拉强度',3
union all select '延伸率',3
go

--则根据调度查试验内容的处理为:

--首先创建处理的辅助函数
create function f_sql(
@试验内容 varchar(10),
@试验次数 int
)returns varchar(8000)
as
begin
declare @r varchar(8000)
set @r=''
while @试验次数>0
select @r=',['+@试验内容+cast(@试验次数 as varchar)+']'+@r
,@试验次数=@试验次数-1
return(@r)
end
go

--调用处理函数生成查询的SQL语句
declare @s varchar(8000)
set @s=''
select @s=@s+dbo.f_sql(试验内容,试验次数)
from 调度
set @s='select '+stuff(@s,1,1,'')+' from 试验数据表'

--执行生成的SQL语句
exec(@s)
go

--删除测试环境
drop table 调度
drop function f_sql

plutu 2004-08-02
  • 打赏
  • 举报
回复
要是试验内容要是只有抗拉强度的话,那就只取对应的抗拉强度字段的内容
plutu 2004-08-02
  • 打赏
  • 举报
回复
啊!你在啊?太好了,表结构是这样的,我跟你说大体需求吧:我有一张调度表,还是前几天问你的问题,调度表中有试验内容和试验次数,试验内容也不一样,比如说内容有抗拉强度3次,延伸率3次,那么对应的抗拉强度1,抗拉强度2,抗拉强度3,延伸率1,延伸率2,延伸率3的内容要根据前面的试验内容和试验次数取出来
zjcxc 2004-08-02
  • 打赏
  • 举报
回复
这个要用动态的SQL语句.

你把你的问题举例说明一下(包括表结构,数据,要求结果),看得不是很明白.

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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