字符类型字段在数据汇总时的累加问题,请帮忙,谢谢!

webdiyer 2003-09-20 09:27:25
表1:
--------------------------------------
ID 单位 用户名
1 1 Cust1
2 1 用户2
3 1 Webdiyer
4 2 Hello
5 2 新用户
6 2 Customer1
7 2 Good
8 2 Newyear
9 3 How
10 3 MyBoy
11 3 higirl
12 3 weehe
-----------------------------
其中ID是标识列,单位是单位表的外键。现在需要将表1中的用户按单位汇总到表2中的用户字段,表2结构如下所示:
---------------------------------
单位 用户
1 Cust1,用户2,Webdiyer
2 Hello,新用户,Customer1,Good,Newyear
3 How,MyBoy,higirl,weehe
------------------------------------------
表2中的用户是以逗号分隔的表1中按单位累加的用户名,请问怎么才能不用游标,直接用一个update语句将表1中的用户汇总到表2中,因为表2还有很多其它字段,我已实现了用一个update语句更新其它字段,但这个用户字段却没法在这个update语句中更新,请教高手有什么办法?谢谢!
...全文
133 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
webdiyer 2003-09-20
  • 打赏
  • 举报
回复
特别感谢 yujohny(踏网无痕) 和 txlicenhe(马可&不做技术高手) 两位高手,现在结帖,谢谢!
yujohny 2003-09-20
  • 打赏
  • 举报
回复
如果不超过1000个,那就用nvarchar(8000)类型,不会有任何问题的
yujohny 2003-09-20
  • 打赏
  • 举报
回复
你改字段类型为nvarchar(8000),应该够长够用了吧
webdiyer 2003-09-20
  • 打赏
  • 举报
回复
谢谢 txlicenhe(马可&不做技术高手) ( ) ,我不太会用那几个方法,而且也觉得那样太麻烦了,最后干脆用一个笨办法解决了:把表2的用户字段的数据类型改成varchar(8000),我觉得既然text类型可以容纳更多的字符,但我所用的更新方法就决定了它的长度不会超过8000个字符,所以把它的类型设为text是没有意义的,不知我的想法和做法是否正确?我想知道这样的改动会造成什么样的潜在影响?因为这个表是原系统留下来的,不过最长的记录也不会超过1000个字符。谢谢!
txlicenhe 2003-09-20
  • 打赏
  • 举报
回复
用Text类型:

READTEXT
UPDATETEXT
WRITETEXT
--------------------
Transact-SQL 参考


READTEXT
读取 text、ntext 或 image 列中的 text、ntext 或 image 值,从指定的偏移量开始读取指定的字节数。

语法
READTEXT { table.column text_ptr offset size } [ HOLDLOCK ]

参数
table.column

是从中读取的表和列的名称。表名和列名必须符合标识符的规则。必须指定表名和列名,不过可以选择是否指定数据库名称和所有者名称。

text_ptr

有效文本指针。text_ptr 必须是 binary(16)。

offset

开始读取 text、image 或 ntext 数据之前跳过的字节数(使用 text 或 image 数据类型时)或字符数(使用 ntext 数据类型时)。使用 ntext 数据类型时,offset 是在开始读取数据前跳过的字符数。使用 text 或 image 数据类型时,offset 是在开始读取数据前跳过的字节数。

size

是要读取数据的字节数(使用 text 或 image 数据类型时)或字符数(使用 ntext 数据类型时)。如果 size 是 0,则表示读取了 4 KB 字节的数据。

HOLDLOCK

使文本值一直锁定到事务结束。其他用户可以读取该值,但是不能对其进行修改。

注释
使用 TEXTPTR 函数获得有效的 text_ptr 值。如果返回不止一行,TEXTPTR 将返回指向指定行中的 text、ntext 或 image 列的指针,或返回指向查询所返回的最后一行中的 text、ntext 或 image 列的指针。由于 TEXTPTR 返回 16 字节的二进制字符串,所以最好声明一个控制文本指针的局部变量,然后在 READTEXT 中使用该变量。有关声明局部变量的更多信息,请参见 DECLARE @local_variable。

在 SQL Server 2000 中可能存在无效的文本指针。有关 text in row 选项的更多信息,请参见 sp_tableoption。有关如何使文本指针无效的更多信息,请参见 sp_invalidate_textptr。

如果 @@TEXTSIZE 函数的值小于为 READTEXT 指定的大小,它将替代为 READTEXT 指定的大小。@@TEXTSIZE 函数是对由 SET TEXTSIZE 语句设置的返回数据字节数的限制。有关如何设置 TEXTSIZE 会话设置的更多信息,请参见 SET TEXTSIZE。

权限
READTEXT 权限默认授予对指定的表具有 SELECT 权限的用户。这些权限可在传递 SELECT 权限时传递。

示例
下例读取 pub_info 表中 pr_info 列的第 2 个至第 26 个字符。

USE pubs
GO
DECLARE @ptrval varbinary(16)
SELECT @ptrval = TEXTPTR(pr_info)
FROM pub_info pr INNER JOIN publishers p
ON pr.pub_id = p.pub_id
AND p.pub_name = 'New Moon Books'
READTEXT pub_info.pr_info @ptrval 1 25
GO


请参见

@@TEXTSIZE

UPDATETEXT

WRITETEXT

©1988-2000 Microsoft Corporation。保留所有权利。
webdiyer 2003-09-20
  • 打赏
  • 举报
回复
问题来了,表2的用户字段类型是text,我用yujohny(踏网无痕)的方法更新时显示如下错误信息:
在工作表中只允许有 text 指针,而决不允许有 text、ntext 或 image 列。查询处理器生成的查询计划要求在工作表中有 text、ntext 或 image 列。

我该怎么更新呢?谢谢!
webdiyer 2003-09-20
  • 打赏
  • 举报
回复
谢谢,我试试!
yujohny 2003-09-20
  • 打赏
  • 举报
回复

update A
set A.要更新的字段 = B.单位用户
from 表2 A INNER join
(select 单位,dbo.getstr(单位) 单位用户 from 表1 group by 单位) B
ON A.单位 = B.单位
txlicenhe 2003-09-20
  • 打赏
  • 举报
回复

--1.创建一个合并的函数
create function fmerg(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str=''
select @str=@str+','+用户名 from 表1 where 单位=@id
set @str=right(@str,len(@str)-1)
return(@str)
End
go

--调用自定义函数得到结果
select distinct 单位,dbo.fmerg(单位) from 表1
yujohny 2003-09-20
  • 打赏
  • 举报
回复
update 表2
set 字段 = (select dbo.getstr(单位) from 表1 where 单位 = 表2.单位)
yujohny 2003-09-20
  • 打赏
  • 举报
回复
--先建立函数如下:
CREATE FUNCTION GETSTR(@Dw NVARCHAR(20))
RETURNS NVARCHAR(200)
AS
BEGIN
DECLARE @str NVARCHAR(200)

SET @str=''

SELECT @str = @str+用户名+','
FROM 表1 WHERE 单位 =@Dw

SET @str = LEFT(@str,LEN(@str)-1)
RETURN @str
END

--然后调用
select 单位,dbo.getstr(单位) from 表1 group by 单位
happy_0325 2003-09-20
  • 打赏
  • 举报
回复
帮你顶!

22,210

社区成员

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

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