declare @t table(A varchar, B varchar) insert @t select 1 , 'a' union all select 2 ,'b' union all select 3 ,'c'SELECT b.* FROM (SELECT x=CAST((SELECT * FROM @t FOR XML PATH('r')) AS XML)) a CROSS APPLY (SELECT a=a.x.query('for $a in //A return string($a)'),b=a.x.query('for $a in //B return string($a)')) b
自己学吧:--各种字符串分函数--3.3.1 使用游标法进行字符串合并处理的示例。 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3--合并处理 --定义结果集表变量 DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理 DECLARE tb CURSOR LOCAL FOR SELECT col1,col2 FROM tb ORDER BY col1,col2 DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100) OPEN tb FETCH tb INTO @col1,@col2 SELECT @col1_old=@col1,@s='' WHILE @@FETCH_STATUS=0 BEGIN IF @col1=@col1_old SELECT @s=@s+','+CAST(@col2 as varchar) ELSE BEGIN INSERT @t VALUES(@col1_old,STUFF(@s,1,1,'')) SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1 END FETCH tb INTO @col1,@col2 END INSERT @t VALUES(@col1_old,STUFF(@s,1,1,'')) CLOSE tb DEALLOCATE tb --显示结果并删除测试数据 SELECT * FROM @t DROP TABLE tb /*--结果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ GO /*==============================================*/ --3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 GO--合并处理函数 CREATE FUNCTION dbo.f_str(@col1 varchar(10)) RETURNS varchar(100) AS BEGIN DECLARE @re varchar(100) SET @re='' SELECT @re=@re+','+CAST(col2 as varchar) FROM tb WHERE col1=@col1 RETURN(STUFF(@re,1,1,'')) END GO--调用函数 SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1 --删除测试 DROP TABLE tb DROP FUNCTION f_str /*--结果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ GO/*==============================================*/ --3.3.3 使用临时表实现字符串合并处理的示例 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3--合并处理 SELECT col1,col2=CAST(col2 as varchar(100)) INTO #t FROM tb ORDER BY col1,col2 DECLARE @col1 varchar(10),@col2 varchar(100) UPDATE #t SET @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END, @col1=col1, col2=@col2 SELECT * FROM #t /*--更新处理后的临时表 col1 col2 ---------- ------------- a 1 a 1,2 b 1 b 1,2 b 1,2,3 --*/ --得到最终结果 SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1 /*--结果 col1 col2 ---------- ----------- a 1,2 b 1,2,3 --*/ --删除测试 DROP TABLE tb,#t GO /*==============================================*/--3.3.4.1 每组 <=2 条记录的合并 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'c',3--合并处理 SELECT col1, col2=CAST(MIN(col2) as varchar) +CASE WHEN COUNT(*)=1 THEN '' ELSE ','+CAST(MAX(col2) as varchar) END FROM tb GROUP BY col1 DROP TABLE tb /*--结果 col1 col2 ---------- ---------- a 1,2 b 1,2 c 3 --*/--3.3.4.2 每组 <=3 条记录的合并 --处理的数据 CREATE TABLE tb(col1 varchar(10),col2 int) INSERT tb SELECT 'a',1 UNION ALL SELECT 'a',2 UNION ALL SELECT 'b',1 UNION ALL SELECT 'b',2 UNION ALL SELECT 'b',3 UNION ALL SELECT 'c',3--合并处理 SELECT col1, col2=CAST(MIN(col2) as varchar) +CASE WHEN COUNT(*)=3 THEN ',' +CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar) ELSE '' END +CASE WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar) ELSE '' END FROM tb a GROUP BY col1 DROP TABLE tb /*--结果 col1 col2 ---------- ------------ a 1,2 b 1,2,3 c 3 --*/ GO
declare @t table(A int ,B varchar(5)) insert @t select 1, 'a' insert @t select 2, 'b' insert @t select 3, 'c' declare @A varchar(5000) declare @B varchar(5000) set @A='' set @B='' select @A=@A+' '+cast(A as varchar(10)) from @T select @B=@B+' '+cast(B as varchar(10)) from @T select @A,@B/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 2 3 a b c(所影响的行数为 1 行)*/
没太明白意思,是这样吗?declare @tmp table (A varchar(10), B varchar(10))declare @tmp2 table (A varchar(10), B varchar(10))insert into @tmp select '1','a' union select '2','b' union select '3','c'declare @As varchar(8000),@Bs varchar(8000) set @As = '' set @Bs = '' select @As = @As + A + ' ' from @tmp select @Bs = @Bs + B + ' ' from @tmpinsert into @tmp2 select @As,@Bsselect * from @tmp select * from @tmp2
去掉下划线?自己转成varchar就没了。因为xquery的结果仍是xml declare @t table(A varchar, B varchar) insert @t select 1 , 'a' union all select 2 ,'b' union all select 3 ,'c'SELECT CAST(b.a AS VARCHAR(MAX)) a , CAST(b.b AS VARCHAR(MAX)) b FROM (SELECT x=CAST((SELECT * FROM @t FOR XML PATH('r')) AS XML)) a CROSS APPLY (SELECT a=a.x.query('for $a in //A return string($a)'),b=a.x.query('for $a in //B return string($a)')) b
declare @t table(A varchar, B varchar) insert @t select 1 , 'a' union all select 2 ,'b' union all select 3 ,'c' DECLARE @A VARCHAR(50),@B VARCHAR(50) SELECT @A=ISNULL(@A,'')+' '+A,@B=ISNULL(@B,'')+' '+B FROM @TSELECT @A,@B/* ------------------------ ---------------------------- 1 2 3 a b c(所影响的行数为 1 行) */
create table aa ( A varchar(8), B varchar(8) )insert into aa values('1','a') insert into aa values('2','b') insert into aa values('3','c') go declare @a1 varchar(8),@b1 varchar(8),@a2 varchar(8),@b2 varchar(8) declare sss cursor for select * from aaopen sssfetch next from sss into @a1,@b1 set @a2='' set @b2='' while @@FETCH_STATUS = 0 begin select @a2=@a2+' '+@a1 select @b2=@b2+' '+@b1 --print @a2 fetch next from sss into @a1,@b1 end print @a2 print @b2 --begin declare @t table(a varchar(10),b varchar(10)) insert into @t values(@a2,@b2) select *from @t --end close sss deallocate sss
insert @t select 1 , 'a'
union all select 2 ,'b'
union all select 3 ,'c'SELECT b.* FROM
(SELECT x=CAST((SELECT * FROM @t FOR XML PATH('r')) AS XML)) a
CROSS APPLY
(SELECT a=a.x.query('for $a in //A return string($a)'),b=a.x.query('for $a in //B return string($a)')) b
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
IF @col1=@col1_old
SELECT @s=@s+','+CAST(@col2 as varchar)
ELSE
BEGIN
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
END
FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO
/*==============================================*/
--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+','+CAST(col2 as varchar)
FROM tb
WHERE col1=@col1
RETURN(STUFF(@re,1,1,''))
END
GO--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO/*==============================================*/
--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3--合并处理
SELECT col1,col2=CAST(col2 as varchar(100))
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET
@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
@col1=col1,
col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1 col2
---------- -------------
a 1
a 1,2
b 1
b 1,2
b 1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO
/*==============================================*/--3.3.4.1 每组 <=2 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'c',3--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=1 THEN ''
ELSE ','+CAST(MAX(col2) as varchar)
END
FROM tb
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ----------
a 1,2
b 1,2
c 3
--*/--3.3.4.2 每组 <=3 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
UNION ALL SELECT 'c',3--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=3 THEN ','
+CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
ELSE ''
END
+CASE
WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
ELSE ''
END
FROM tb a
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ------------
a 1,2
b 1,2,3
c 3
--*/
GO
declare @t table(A int ,B varchar(5))
insert @t select 1, 'a'
insert @t select 2, 'b'
insert @t select 3, 'c'
declare @A varchar(5000)
declare @B varchar(5000)
set @A='' set @B=''
select @A=@A+' '+cast(A as varchar(10)) from @T
select @B=@B+' '+cast(B as varchar(10)) from @T
select @A,@B/*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 2 3 a b c(所影响的行数为 1 行)*/
没太明白意思,是这样吗?declare @tmp table
(A varchar(10),
B varchar(10))declare @tmp2 table
(A varchar(10),
B varchar(10))insert into @tmp
select '1','a' union
select '2','b' union
select '3','c'declare @As varchar(8000),@Bs varchar(8000)
set @As = ''
set @Bs = ''
select @As = @As + A + ' ' from @tmp
select @Bs = @Bs + B + ' ' from @tmpinsert into @tmp2 select @As,@Bsselect * from @tmp
select * from @tmp2
declare @t table(A varchar, B varchar)
insert @t select 1 , 'a'
union all select 2 ,'b'
union all select 3 ,'c'SELECT CAST(b.a AS VARCHAR(MAX)) a , CAST(b.b AS VARCHAR(MAX)) b FROM
(SELECT x=CAST((SELECT * FROM @t FOR XML PATH('r')) AS XML)) a
CROSS APPLY
(SELECT a=a.x.query('for $a in //A return string($a)'),b=a.x.query('for $a in //B return string($a)')) b
declare @t table(A varchar, B varchar)
insert @t select 1 , 'a'
union all select 2 ,'b'
union all select 3 ,'c'
DECLARE @A VARCHAR(50),@B VARCHAR(50)
SELECT @A=ISNULL(@A,'')+' '+A,@B=ISNULL(@B,'')+' '+B FROM @TSELECT @A,@B/*
------------------------ ----------------------------
1 2 3 a b c(所影响的行数为 1 行)
*/
(
A varchar(8),
B varchar(8)
)insert into aa values('1','a')
insert into aa values('2','b')
insert into aa values('3','c')
go
declare @a1 varchar(8),@b1 varchar(8),@a2 varchar(8),@b2 varchar(8)
declare sss cursor
for
select * from aaopen sssfetch next from sss into @a1,@b1
set @a2=''
set @b2=''
while @@FETCH_STATUS = 0
begin
select @a2=@a2+' '+@a1
select @b2=@b2+' '+@b1
--print @a2
fetch next from sss into @a1,@b1
end
print @a2
print @b2
--begin
declare @t table(a varchar(10),b varchar(10))
insert into @t values(@a2,@b2)
select *from @t
--end
close sss
deallocate sss