迭代SQL Server 2008 R2表变量并连接值

时间:2015-05-01 19:12:29

标签: sql loops sql-server-2008-r2

我有一个表变量@Holding两列:id(非唯一)和message

id     message
----   -------
2      give
2      me
2      help 
3      Need
3      help
1      help!

结果应为

2     give me help
3     Need help
1     help!

这非常简化,但表明存在可能不止一次存在的id,以及应该连接成字符串的某种文本。

我无法管理它来循环遍历这个表变量(但也不能通过表!)。

我尝试了一个游标(我没有正确理解),但当然失败了。 记录的数量并不多,在该表变量中甚至不是100。

谢谢你。救命 迈克尔

3 个答案:

答案 0 :(得分:0)

如果您使用的是SQL Server,这应该可以使用。

<label>
  My first label text
  <input type="checkbox" />
</label>
<label>
  My second label text
  <input type="checkbox" />
</label>

答案 1 :(得分:0)

Original question

无需CURSOR,WHILE循环或用户定义的功能

只需要对FOR XML和PATH有创意。

[注意:此解决方案仅适用于SQL 2005及更高版本。原始问题没有指定正在使用的版本。]

CREATE TABLE #YourTable ([ID] INT, [Name] CHAR(1), [Value] INT)

INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'A',4)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'B',8)
INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (2,'C',9)

SELECT 
  [ID],
  STUFF((
    SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) 
    FROM #YourTable 
    WHERE (ID = Results.ID) 
    FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)')
  ,1,2,'') AS NameValues
FROM #YourTable Results
GROUP BY ID

DROP TABLE #YourTable

答案 2 :(得分:0)

相同,代码中的字母更少:

DECLARE @t AS TABLE ( id INT, msg VARCHAR(100) );

INSERT  INTO @t
VALUES     ( 2, 'give' );
INSERT  INTO @t
VALUES        ( 2, 'me' );
INSERT  INTO @t
VALUES        ( 2, 'help' );
INSERT  INTO @t
VALUES        ( 3, 'Need' );
INSERT  INTO @t
VALUES        ( 3, 'help' );
INSERT  INTO @t
VALUES        ( 1, 'help!' );

SELECT DISTINCT
    id ,
    (
      SELECT ST1.msg + ' '
      FROM @t ST1
      WHERE ST1.id = ST2.id
    FOR XML PATH('')
    ) t
FROM
    @t ST2;