Думайте о конкатенации переменных как о странности;это неподдерживаемое поведение, которое часто используется в коде :) Если вы хотите продолжать использовать его, вы можете изменить свой оператор UPDATE следующим образом:
UPDATE t
SET HTML = @Test
FROM #test t
Альтернативным методом будет использование синтаксиса FOR XML дляconcatenate
CREATE TABLE #Test
(
EmployeeId INT
, Html VARCHAR(MAX)
) ;
CREATE TABLE #EmployeeItems
(
EmployeeId INT
, ItemNo INT
) ;
INSERT INTO #EmployeeItems
( EmployeeId, ItemNo )
VALUES ( 1, 1 ) ,
( 1, 2 ) ;
INSERT INTO #Test
( EmployeeId, Html )
VALUES ( 1, '<div class="first">' ) ;
UPDATE #Test
SET HTML+= REPLACE(REPLACE(( SELECT '|div class="second"|'
+ CAST(E.ItemNo AS VARCHAR) + '|/div|'
FROM #Test AS T
JOIN #EmployeeItems AS E ON T.EmployeeId = E.EmployeeId
FOR
XML PATH('')
), '|div class="second"|',
'<div class="second">'), '|/div|', '</div>')
UPDATE #Test
SET Html += '</div>' ;
SELECT Html
FROM #Test ;
DROP TABLE #Test ;
DROP TABLE #EmployeeItems ;
Или (и, возможно, лучше), просто создайте свой XML-документ напрямую.
SELECT 'first' AS "div/@class"
, 'second' AS "div/div/@class"
, e.ItemNo AS "div/div"
FROM #EmployeeItems e
FOR XML PATH('')
Дополнительный ответ для отредактированного вопроса:
BEGIN TRAN
CREATE TABLE #Actions
(
EmployeeId INT
, EmployeeName VARCHAR(100)
, ActionStart TIME
, ActionEnd TIME
, Type VARCHAR(10)
) ;
INSERT INTO #Actions
( EmployeeId, EmployeeName, ActionStart, ActionEnd, Type )
VALUES ( 1, 'Bob', '09:00', '12:00', 'action' ),
( 1, 'Bob', '14:30', '16:00', 'action' ),
( 1, 'Bob', '18:00', '20:00', 'event' ),
( 2, 'Susan', '10:00', '12:00', 'action' ) ;
;
WITH CTE
AS ( SELECT DISTINCT
EmployeeID
, EmployeeName
FROM #actions
)
SELECT 'employee' AS "@class"
, employeeid AS "@employeeid"
, employeename AS "@employeename"
, ( SELECT 'action' AS "@class"
, ActionStart AS "@start"
, ActionEnd AS "@end"
, Type AS "@type"
FROM #Actions a2
WHERE a2.EmployeeId = a.EmployeeID
FOR
XML PATH('div')
, TYPE
)
FROM cte a
FOR XML PATH('div')
ROLLBACK TRAN