我想定义一个函数,参数为公司ID,我想返回一个字符串,该字符串为:每个产品名称连接起来的一个字符串,并且各产品名之间用“、”分开,

bluemoon0001 2005-06-13 09:23:35
我想定义一个函数,参数为公司ID,我想返回一个字符串,该字符串为:每个产品名称连接起来的一个字符串,并且各产品名之间用“、”分开,在线等,急...,解决就结贴...
产品表:product
字段:id(种子,主键),pname(产品名称),CoID(公司ID),....
请问大家如何编写这个函数?在线等,解决就结贴...
...全文
98 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluemoon0001 2005-06-13
  • 打赏
  • 举报
回复
现在结贴了,唉,一个函数把我难成这个样子,看来我在asp版的两颗星星是白混了,以后还会经常到SQL server请教大家,望大家帮帮忙。
bluemoon0001 2005-06-13
  • 打赏
  • 举报
回复
楼上的兄弟,我用了你的测试得不到值,可能是我操作的有问题吧,不过根据两位的提示,我总算搞定了,不过我觉得我写的没有楼上写的效率高吧,但是我用楼上的一时又搞不定,我就先用我自己写的了,有时间再好好的调试一下楼上的吧,谢过两位了。我写的如下,还往指教:
CREATE FUNCTION fn_productname(@id varchar(100))
RETURNS varchar(500)
AS
BEGIN
declare @s varchar(500),@stempstr varchar(500)
set @s=''
set @stempstr=''
while len(@id)>0
begin
if charindex(',',@id)>0
begin
set @stempstr=left(@id,charindex(',',@id)-1)
set @id=right(@id,len(@id)-charindex(',',@id))
end
else
begin
set @stempstr=@id
set @id=''
end
select @s=@s+pname+'、' from product where coid in (@stempstr)
end
return (@s)
END


xluzhong 2005-06-13
  • 打赏
  • 举报
回复
CREATE FUNCTION fn_productname(@id varchar(100))
RETURNS nvarchar(500)
AS
BEGIN
declare @s nvarchar(500)
set @s=''
select @s=@s+pname+'、' from product where Charindex(','+CoId+',',','+@id+',')>0
return (@s)
END
bluemoon0001 2005-06-13
  • 打赏
  • 举报
回复
谢谢两位,问题基本解决了,不好意思,我刚才没有说清楚,我的CoID是int型的,
我按照两位的意思,写了如下函数:

CREATE FUNCTION fn_productname(@id varchar(100))
RETURNS nvarchar(500)
AS
BEGIN
declare @s nvarchar(500)
set @s=''
select @s=@s+pname+'、' from product where CoID in (@id)
return (@s)
END


我在查询分析器里用如下语句:
declare @tempstr varchar(500)
set @tempstr=dbo.fn_productname('1')
print @tempstr
得:产品1、产品2、产品3、
这三个产品对应的公司CoID为1
这个结果是对的:
我还有三个产品对应的公司CoID为2

可是当我在查询分析器中用如下语句时:
declare @tempstr varchar(500)
set @tempstr=dbo.fn_productname('1,2')
print @tempstr

得:
服务器: 消息 245,级别 16,状态 1,过程 fn_productname,行 7
将 varchar 值 '1,2' 转换为数据类型为 int 的列时发生语法错误。


但是如果我把函数改为如下就能得到正确的结果,但这样我代入的ID无效啊,我只是这样做一下测试,但我不知道什么原因,如何解决呢。
CREATE FUNCTION fn_productname(@id varchar(100))
RETURNS nvarchar(500)
AS
BEGIN
declare @s nvarchar(500)
set @s=''
select @s=@s+pname+'、' from product where CoID in (1,2)
return (@s)
END


我说的有点乱,不知道两位能不能看得明白,还往两位帮帮忙,然后我就结贴。
Andy__Huang 2005-06-13
  • 打赏
  • 举报
回复

--函數
create function dbo.fn_b(@a varchar(10))
returns varchar(1000)
as
begin
declare @s varchar(1000)
set @s=''
select @s=@s+[B]+'、' from tb where A=@a ---看實際情況,這裡加“、”
return (@s)
end
xluzhong 2005-06-13
  • 打赏
  • 举报
回复
create function f_contractstr(@CoID nvarchar(100))
returns nvarchar(2000)
as
begin
declare @s nvarchar(2000)
set @s=''
select @s=@s+','+pname from product where CoID=@CoID
return(stuff(@s,1,1,''))
end
go

---
select coid,dbo.f_contractstr(coid) as pname from product group by coid

---
drop function f_contractstr
bluemoon0001 2005-06-13
  • 打赏
  • 举报
回复
先谢了,我试一下,行了就结贴。
Andy__Huang 2005-06-13
  • 打赏
  • 举报
回复
達到要求嗎?
Andy__Huang 2005-06-13
  • 打赏
  • 举报
回复
給你一個例子看



--建表
create table tb (A varchar(10),B varchar(1000))
Insert into tb
select '111','AA0000,AA0001,AA0002,'
union all select '111','BB0000,BB0001,BB0002,'
union all select '222','AA0120,AA0102,AA1453,'
union all select '222','BB1212,BB3423,BB2123,'

select * from tb

--函數
create function dbo.fn_b(@a varchar(10))
returns varchar(1000)
as
begin
declare @s varchar(1000)
set @s=''
select @s=@s+[B] from tb where A=@a
return (@s)
end

--刪除
drop table tb
drop function dbo.fn_b

--結果
select A,B=dbo.fn_b(A) from tb group by A
A B
-------------------------------------------
111 AA0000,AA0001,AA0002,BB0000,BB0001,BB0002,
222 AA0120,AA0102,AA1453,BB1212,BB3423,BB2123,

bluemoon0001 2005-06-13
  • 打赏
  • 举报
回复
注:我想要的是函数,不是存储过程,因为我要在另一个存储过程里用到这个函数。

27,579

社区成员

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

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