字符串连接函数的BUG?怎么按时间先后累加呀.

czyoooo 2011-01-29 06:40:46
---创建字符连接函数---
create function [dbo].[f_str](@a varchar(20),@b varchar(20))
returns varchar(50)
as
begin
declare @s varchar(800)
select @s=isnull(@s+'_','')+ltrim(c)
from tb
where a=@a and b=@b
return @s
end

---创建字符连接函数---
create function [dbo].[f_str](@a varchar(20),@b varchar(20))
returns varchar(50)
as
begin
declare @s varchar(800)
select @s=isnull(@s+'_','')+ltrim(c)
from tb
where a=@a and b=@b order by tb.created desc
return @s
end


加上
order by tb.created desc
后,发现只能取到第一个,怎么按时间先后累加呀.

tb

id name created
1 a 2010-01-01
2 b 2010-01-02
3 c 2010-01-03
...全文
101 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linares 2011-01-29
  • 打赏
  • 举报
回复
你可以看看执行计划:

如果 计算标量 之后 select 输出,结果是正确累加的。

如果 计算标量 之后 排序 再 select 输入,那么结果就没有累加,只有一项。
Linares 2011-01-29
  • 打赏
  • 举报
回复
这个可以说是BUG,也可以说不是,官方文档没有这样的使用方法。

分析:

1、tb 是视图,tb.created 是一个计算列

2、returns varchar(50) 这个长度不够,改为 varchar(800)。
Shawn 2011-01-29
  • 打赏
  • 举报
回复
参考一下:
create table tb
(
id int,
[name] varchar(100),
created datetime
)
insert tb
select 1, 'a', '2010-01-01' union all
select 1, 'a', '2010-01-02' union all
select 3, 'c', '2010-01-03'

--function
alter function [dbo].[f_str](@a varchar(20),@b varchar(20))
returns varchar(50)
as
begin
declare @s varchar(800)
set @s = ''
select @s = @s + '_' + ltrim(convert(varchar(10), created, 120))
from tb
where id=@a and [name]=@b order by created desc

if @s > ''
set @s = right(@s, len(@s)-1)
return @s
end

--Result
select result = dbo.[f_str] (1, 'a')
/*
result
2010-01-02_2010-01-01
*/
Linares 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 maco_wang 的回复:]

引用 10 楼 czyoooo 的回复:
妖怪了,我加了ORDER BY之后,就只能取到第一个

你的函数里面没有进行累加。

SQL code
--你的函数中:
select @s=isnull(@s+'_','')+ltrim(c)
from tb
--累计应该是类似这样:
select @s=@s+isnull(@s+'_','')+ltrim(c)
from tb

……
[/Quote]

不好意思

select @s=@s+isnull(@s+'_','')+ltrim(c)
from tb

如果 @s 没有初值 永远等于 NULL
叶子 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 czyoooo 的回复:]
妖怪了,我加了ORDER BY之后,就只能取到第一个
[/Quote]
你的函数里面没有进行累加。

--你的函数中:
select @s=isnull(@s+'_','')+ltrim(c)
from tb
--累计应该是类似这样:
select @s=@s+isnull(@s+'_','')+ltrim(c)
from tb
vincent_cheung 2011-01-29
  • 打赏
  • 举报
回复
SQL这么简单的功能没BUG,查程序或数据原因吧,或是传入参数
czyoooo 2011-01-29
  • 打赏
  • 举报
回复
妖怪了,我加了ORDER BY之后,就只能取到第一个
vincent_cheung 2011-01-29
  • 打赏
  • 举报
回复
总之,该提问很乱,只能意会,不会让大家猜你想做什么吧?哈哈
vincent_cheung 2011-01-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 vincent_cheung 的回复:]

在我这怎么运行没问题,检查一下你的表数据是不是有NULL呢?
还有ltrim(c),tb怎么没有c列
[/Quote]
连接字段中如果有NULL记录,只能从条一下累加,建议在此做isnull判断
vincent_cheung 2011-01-29
  • 打赏
  • 举报
回复
在我这怎么运行没问题,检查一下你的表数据是不是有NULL呢?
还有ltrim(c),tb怎么没有c列
-晴天 2011-01-29
  • 打赏
  • 举报
回复
是这个意思吧?
create table tb(id int,name nvarchar(10),created datetime)
insert into tb select 1,'a','2010-01-01'
insert into tb select 2,'b','2010-01-02'
insert into tb select 3,'c','2010-01-03'
go
declare @s nvarchar(500)
set @s=''
select @s=@s+name from tb order by created
select @s
go
drop table tb
/*
---------------------------------------------------------------------------------------
abc

(1 行受影响)

*/
叶子 2011-01-29
  • 打赏
  • 举报
回复

declare @table table (id int,name varchar(1),created datetime)
insert into @table
select 1,'a','2010-01-01' union all
select 2,'b','2010-01-02' union all
select 3,'c','2010-01-03'

declare @s varchar(20)
set @s=''
select @s=@s+isnull('_'+name,'') from @table order by created desc
set @s=substring(@s,2,len(@s))
select @s
/*
c_b_a
*/
叶子 2011-01-29
  • 打赏
  • 举报
回复
c字段也没有呀?
叶子 2011-01-29
  • 打赏
  • 举报
回复

--这样就是累加了
declare @s varchar(800)
set @s=''
select @s=@s+isnull(@s+'_','')+ltrim(c)
from tb
where a=@a and b=@b order by tb.created desc
return @s

-晴天 2011-01-29
  • 打赏
  • 举报
回复
tb 中并没有列名叫 a,b,你想查什么?
叶子 2011-01-29
  • 打赏
  • 举报
回复
tb中没有这个a和b字段呀?


select @s=isnull(@s+'_','')+ltrim(c)
from tb
where a=@a and b=@b

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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