字符串连接函数的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
...全文
63 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
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
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2011-01-29 06:40
社区公告
暂无公告