帮忙修改一个存储过程的函数 在线等高人

beil0eve 2012-07-12 09:46:14
下午问过一次 可能没说清楚 没得到好的答案 现在重新开贴问一次
ALTER FUNCTION [dbo].[GetHistory]
(
@IssueNum int,@Name varchar(100),@NumSum int,@Result varchar(50),@History varchar(100)
)
RETURNS varchar(1024)
AS
BEGIN
DECLARE @tempID int
select top 1 @tempID=IssueNum from NumsData where IssueNum<@IssueNum and [Name]=@Name and NumSum =@NumSum and Result=@Result and History=@History order by IssueNum desc
set @History=''
if @tempID>0
begin
select top 3 @History=@History+R1 from NumsData where IssueNum<=@tempID and [Name]=@Name order by IssueNum desc
end
return @History
END

比如 编号是118的数据 根据这个条件IssueNum<@IssueNum and [Name]=@Name and NumSum =@NumSum and Result=@Result and History=@History order by IssueNum desc
搜索到了一条编号为089的数据
现在的返回值是@History=@History+R1 也就是返回的是 118 117 116的R1的值
而我需要得到的返回值是089后面三条数据 也就是090 091 092 三条数据R1字段的值
比如三个值分别是 好 孬 好
那我需要得到的@History返回值就是:好孬好 这样一个数据
...全文
216 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
13870420 太谢谢了
yhnujm##33 2012-07-12
  • 打赏
  • 举报
回复
刚才想了想这个思路不对!!!inner join的应该是后三个连续的编号,而我判断的他是否三个连续的编号!!
不应该是inner Join !!方便留下QQ吗?帮你解决一下,这样回复太慢了
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
消息 207,级别 16,状态 1,过程 GetHistory,第 28 行
列名 'NumsData' 无效。
消息 4104,级别 16,状态 1,过程 GetHistory,第 28 行
无法绑定由多个部分组成的标识符 "B.IssueNum"。
消息 4104,级别 16,状态 1,过程 GetHistory,第 28 行
无法绑定由多个部分组成的标识符 "B.IssueNum"。


就这三个了
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
消息 207,级别 16,状态 1,过程 GetHistory,第 28 行
列名 'NumsData' 无效。
消息 207,级别 16,状态 1,过程 GetHistory,第 28 行
列名 'IssuseNum' 无效。
消息 4104,级别 16,状态 1,过程 GetHistory,第 28 行
无法绑定由多个部分组成的标识符 "B.IssuseNum"。
消息 207,级别 16,状态 1,过程 GetHistory,第 28 行
列名 'IssuseNum' 无效。
消息 4104,级别 16,状态 1,过程 GetHistory,第 28 行
无法绑定由多个部分组成的标识符 "B.IssueNum"。
yhnujm##33 2012-07-12
  • 打赏
  • 举报
回复
看看这回怎么样了
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
我就是加了个where 然后出了更多的问题啊
消息 207,级别 16,状态 1,过程 GetHistory,第 27 行
列名 'NumsData' 无效。
消息 4104,级别 16,状态 1,过程 GetHistory,第 27 行
无法绑定由多个部分组成的标识符 "C.IssuseNum"。

才又来问的
我对这个接触不久 以前很少写数据库 不好意思
yhnujm##33 2012-07-12
  • 打赏
  • 举报
回复
select @History=@History+A.R1 from NumsData AS A
inner join
(
select IssueNum
from NumsData AS D
where D.NumsData=@IssueNum
and
(select count(*) from NumsData as C where C.IssuseNum>B.IssuseNum and C.IssuseNum<=B.IssueNum+3)=3
) AS B
on A.IssueNum=B.IssueNum

哎,只是想了个思路,楼主你想都没想吗?
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
where D.NumsData=@IssueNum and (select count(*) from NumsData C.IssuseNum>B.IssuseNum and C.IssuseNum<=B.IssueNum+3)=3
消息 102,级别 15,状态 1,过程 GetHistory,第 27 行
'.' 附近有语法错误。
yhnujm##33 2012-07-12
  • 打赏
  • 举报
回复
select top 3 @History=@History+R1 from NumsData where IssueNum<=@tempID and [Name]=@Name order by IssueNum desc


select @History=@History+A.R1 from NumsData AS A
inner join
(select IssueNum,
from NumsData AS D
where D.NumsData=@IssueNum and (select count(*) from NumsData C.IssuseNum>B.IssuseNum and C.IssuseNum<=B.IssueNum+3)=3
) AS B
on A.IssueNum=B.IssueNum
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
还在测试 没有遇到不连续的数据 不过已经不是一开始118前两条的了 已经是新数据了
筱筱澄 2012-07-12
  • 打赏
  • 举报
回复
你现在得到的结果是多少?

beil0eve 2012-07-12
  • 打赏
  • 举报
回复
比如 数据库最后一条数据的编号是118 根据这个条件IssueNum<@IssueNum and [Name]=@Name and NumSum =@NumSum and Result=@Result and History=@History order by IssueNum desc
搜索到了一条编号为089的数据
我需要得到的返回值是089后面三条数据 也就是090 091 092 三条数据R1字段的值
比如三个值分别是 好 孬 好
那我需要得到的@History返回值就是:好孬好 这样一个数据
中间不能有数据的间隔 必须是紧连的
筱筱澄 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:
哦,明确一下。假如089 后面有一个090 但后面没有091 ,接下来有092 093 094
你要的是092 093 094的三条记录中R1字段的拼接值是吗?



不是的 如果没有091 那这条数据就不要了
只需要 090 091 092 就是089后面三条的R1的字段拼接 中间不能有数据间隔
[/Quote]
给点测试数据吧
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
哦,明确一下。假如089 后面有一个090 但后面没有091 ,接下来有092 093 094
你要的是092 093 094的三条记录中R1字段的拼接值是吗?
[/Quote]


不是的 如果没有091 那这条数据就不要了
只需要 090 091 092 就是089后面三条的R1的字段拼接 中间不能有数据间隔
筱筱澄 2012-07-12
  • 打赏
  • 举报
回复

--try
select top 3 @History=@History+R1 from NumsData where IssueNum>@tempID and [Name]=@Name order by IssueNum


如果不行就弄点数据说明把
yhnujm##33 2012-07-12
  • 打赏
  • 举报
回复
哦,明确一下。假如089 后面有一个090 但后面没有091 ,接下来有092 093 094
你要的是092 093 094的三条记录中R1字段的拼接值是吗?
人生无悔 2012-07-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
直接改升序应该不行 这样得到的应该是 119 120 121 的R1 数据库里118已经是最后一条数据了
我要的是找到的符合条件的那条数据的后面三个R1 也就是090 091 092 三条数据R1字段的值
[/Quote]
呵呵,试下你就知道了
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
不好意思 因为是在存储过程里写的 就说成是存储过程函数了
后面三个编号是连续的 不是大于当前编号的 应该是大与:根据当前编号搜索出的符合条件的那条数据的最小的三个编号
比如当前编号是118 根据这个条件IssueNum<@IssueNum and [Name]=@Name and NumSum =@NumSum and Result=@Result and History=@History order by IssueNum desc
搜索到了一条编号为089的数据
要得到的是大于089的数据的最小的三个编号 但三个编号是要连续的 中间不能有数据间隔
yhnujm##33 2012-07-12
  • 打赏
  • 举报
回复
1、这不存储过程函数,这就是T-SQL函数

2、后面三个值编号一定是连续的,还是大于当前编号的,最小的三个编号
beil0eve 2012-07-12
  • 打赏
  • 举报
回复
直接改升序应该不行 这样得到的应该是 119 120 121 的R1 数据库里118已经是最后一条数据了
我要的是找到的符合条件的那条数据的后面三个R1 也就是090 091 092 三条数据R1字段的值
加载更多回复(1)

34,575

社区成员

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

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