SQL函数,怎样修改一下

usernamezero 2009-11-20 11:45:48
--多行合并一行
alter Function s_Marge(@ProductNo varchar(30),@ID varchar(30))
returns varchar(500)
as
begin
declare @re varchar(500)
declare @reMark varchar(500)
declare @t table (k int identity, a char); --定义一个表两列k自动增长a为多行中的列
-------------------------------定义一游标来循环插入表
begin
declare myCursor cursor for
select reMark from Detect2 where Detectid=@ID and ProductNo=@ProductNo
open myCursor
fetch next from myCursor into @reMark
while @@fetch_status=0
begin
insert into @t values(@reMark)
fetch next from myCursor into @reMark
end
close myCrusor
deallocate myCursor
end
-------------------------插入完成后
with cte(a, k)
as
(
select cast(t.a as varchar(max)), t.k from @t t
where k = 1
union all
select c.a + cast(t.a as varchar(max)), t.k
from @t t
join cte c on t.k = c.k+1
)
select top 1 a from cte order by k desc
set @re=(select top 1 a from cte order by k desc)
return @re
end


错误提示
消息 444,级别 16,状态 2,过程 s_Marge,第 24 行
函数中含有的 SELECT 语句无法向客户端返回数据。
谁能帮我改一下
...全文
205 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
usernamezero 2009-11-20
  • 打赏
  • 举报
回复
注释掉这句也不对
ACMAIN_CHM 2009-11-20
  • 打赏
  • 举报
回复
join cte c on t.k = c.k+1
)
-- select top 1 a from cte order by k desc
set @re=(select top 1 a from cte order by k desc)
return @re
end

注释掉这句再试试。
usernamezero 2009-11-20
  • 打赏
  • 举报
回复
用的是SQL2005
阿_布 2009-11-20
  • 打赏
  • 举报
回复
mysql 中有top?要改成limit吧!
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 usernamezero 的回复:]
最后一怒之下我把它改成存储过程了
Create procedure s_MargeReMark(@ProductNo varchar(30),@ID varchar(30))
as
begin
    declare @reMark varchar(500)
    declare @t table (k int identity, a varchar(500))
    insert into @t(a)
select reMark from Detect2 where Detectid=@ID and ProductNo=@ProductNo
update @t set a=a+'  '
    with cte(a, k)
    as
    ( select cast(t.a as varchar(max)), t.k from @t t
where k = 1
  union all
  select c.a + cast(t.a as varchar(max)), t.k
from @t  t
join cte c on t.k = c.k+1 )
select top 1 a from cte order by k desc
end
紧供参考
[/Quote]
这个就肯定可以啦,存储过程可以直接返回结果集,而函数不允许
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复

    set @re=(select top 1 a from cte order by k desc) 
return @re



改成--------------->

select top 1 @re=a from cte order by k desc
return @re


试下
usernamezero 2009-11-20
  • 打赏
  • 举报
回复
最后一怒之下我把它改成存储过程了
Create procedure s_MargeReMark(@ProductNo varchar(30),@ID varchar(30))
as
begin
declare @reMark varchar(500)
declare @t table (k int identity, a varchar(500))
insert into @t(a)
select reMark from Detect2 where Detectid=@ID and ProductNo=@ProductNo
update @t set a=a+' '
with cte(a, k)
as
( select cast(t.a as varchar(max)), t.k from @t t
where k = 1
union all
select c.a + cast(t.a as varchar(max)), t.k
from @t t
join cte c on t.k = c.k+1 )
select top 1 a from cte order by k desc
end
紧供参考
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 usernamezero 的回复:]
不正确
with cte(a, k)
    as
    ( select cast(t.a as varchar(max)), t.k from @t t
where k = 1
  union all
  select c.a + cast(t.a as varchar(max)), t.k
from @t  t
join cte c on t.k = c.k+1 )
select top 1 a from cte order by k desc
看了这一下这个地方必须是连用的

[/Quote]

不要“select top 1 a from cte order by k desc”这句啊
函数里面不能这样直接返回结果集的,必须通过表变量来进行return回去
阿_布 2009-11-20
  • 打赏
  • 举报
回复
把set @re=(select top 1 a from cte order by k desc) 改成
select a into @a from cte order by k desc limit 1; 试一下
阿_布 2009-11-20
  • 打赏
  • 举报
回复
把set @re=(select top 1 a from cte order by k desc) 改成
select top 1 a into @a from cte order by k desc; 试一下
usernamezero 2009-11-20
  • 打赏
  • 举报
回复
不正确
with cte(a, k)
as
( select cast(t.a as varchar(max)), t.k from @t t
where k = 1
union all
select c.a + cast(t.a as varchar(max)), t.k
from @t t
join cte c on t.k = c.k+1 )
select top 1 a from cte order by k desc
看了这一下这个地方必须是连用的
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 usernamezero 的回复:]
对对效果是一样的,呵呵
报的错误就是set 附件有错误
消息 156,级别 15,状态 1,过程 s_Marge,第 23 行
关键字 'set' 附近有语法错误。

[/Quote]

set赋值语句在function下是支持的啊
你这样调试下看看:

set @re=(select top 1 a from cte order by k desc)
return @re

-- set @re=(select top 1 a from cte order by k desc)
return 'abc'

看这样解释掉set那句是否正确了

usernamezero 2009-11-20
  • 打赏
  • 举报
回复
对对效果是一样的,呵呵
报的错误就是set 附件有错误
消息 156,级别 15,状态 1,过程 s_Marge,第 23 行
关键字 'set' 附近有语法错误。
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 usernamezero 的回复:]
在说了那个set 的地方是会报错的
[/Quote]

报什么错呢?
贴出来看看
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 usernamezero 的回复:]
游标换回一行的不行,我的那个生名的ID不是唯一的
这个Detectid=@ID 是个主表ID,productNo=@ProductNo 他是有多行返回的

[/Quote]
begin
declare myCursor cursor for
select reMark from Detect2 where Detectid=@ID and ProductNo=@ProductNo
open myCursor
fetch next from myCursor into @reMark
while @@fetch_status=0
begin
insert into @t values(@reMark)
fetch next from myCursor into @reMark
end
close myCrusor
deallocate myCursor
end

------------->
insert into @t(a)
select reMark from Detect2 where Detectid=@ID and ProductNo=@ProductNo


这2个效果是一样的
usernamezero 2009-11-20
  • 打赏
  • 举报
回复
在说了那个set 的地方是会报错的
usernamezero 2009-11-20
  • 打赏
  • 举报
回复
游标换回一行的不行,我的那个生名的ID不是唯一的
这个Detectid=@ID 是个主表ID,productNo=@ProductNo 他是有多行返回的
vinsonshen 2009-11-20
  • 打赏
  • 举报
回复
帮你改了下:

alter Function s_Marge(@ProductNo varchar(30),@ID varchar(30)) 
returns varchar(500)
as
begin
declare @re varchar(500)
declare @reMark varchar(500)
declare @t table (k int identity, a char); --定义一个表两列k自动增长a为多行中的列
-------------------------------定义一游标来循环插入表
--游标换回一个语句就可以了:
insert into @t(a)
select reMark from Detect2 where Detectid=@ID and ProductNo=@ProductNo
-------------------------插入完成后
;with cte(a, k)
as
(
select cast(t.a as varchar(max)), t.k from @t t
where k = 1
union all
select c.a + cast(t.a as varchar(max)), t.k
from @t t
join cte c on t.k = c.k+1
)
set @re=(select top 1 a from cte order by k desc)
return @re
end
usernamezero 2009-11-20
  • 打赏
  • 举报
回复
没有高人吗??
1.SQL Server 2014简介.mp4 10.SQL Server 2014定义表主键、外键.mp4 11.SQL Server 2014新增表记录.mp4 12.SQL Server 2014查询表记录.mp4 13.SQL Server 2014修改表记录.mp4 14.SQL Server 2014删除表记录.mp4 15.SQL Server 2014条件限制where.mp4 16.SQL Server 2014 BETWEEN语法.mp4 17.SQL Server 2014子查询IN.mp4 18.SQL Server 2014子查询EXISTS.mp4 19.SQL Server 2014返回记录排序.mp4 2.SQL Server 2014硬件和软件要求.mp4 20.SQL Server 2014关联查询.mp4 21.SQL Server 2014聚合函数AVG() SUM().mp4 22.SQL Server 2014聚合函数MIN() MAX().mp4 23.SQL Server 2014COUNT和SUM()函数.mp4 24.SQL Server 2014 LEN()函数.mp4 25.SQL Server 2014随机数的产生.mp4 26.SQL Server 2014 GETDATE() GETUTCDATE().mp4 27.SQL Server 2014 CONVERT函数.mp4 28.SQL Server 2014 DATEDIFF函数.mp4 29.SQL Server 2014 DATEPART函数.mp4 3.SQL Server 2014数据库安装.mp4 30.SQL Server 2014 CHARINDEX函数.mp4 31.SQL Server 2014 STUFF函数.mp4 32.SQL Server 2014 SUBTRING函数.mp4 33..SQL Server 2014 LEFT()和RIGHT函数.mp4 34.SQL Server 2014 LTRIM()和RTRIM()函数.mp4 35.SQL Server 2014 UPPER()和LOWER()函数.mp4 36.SQL Server 2014 REPLACE()函数.mp4 37.SQL Server 2014 REPLICATE和SPACE()函数.mp4 38.SQL Server 2014 REVERSE函数.mp4 39.SQL Server 2014 CAST函数.mp4 4.SQL Server 2014数据库创建.mp4 40.SQL Server 2014 CASE函数.mp4 5.SQL Server 2014数据库修改与删除.mp4 6.SQL Server 2014数据库备份与还原.mp4 7.SQL Server 2014数据类型.mp4 8.SQL Server 2014新建表.mp4 9.SQL Server 2014修改、删除表结构.mp4 PPT SQL Server 2014简介 SQL Server 2014数据库备份与还原 SQL Server 2014数据库创建 SQL Server 2014数据库修改与删除 SQL Server 2014数据类型

57,063

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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