Попробуйте этот код SQL.Я воссоздал фиктивный стол, похожий на ваш оригинальный стол.Существует UDF, который также должен быть создан.Оставшийся код может быть частью сохраненного процесса.
set xact_abort on
begin tran
CREATE TABLE TestTable
(
TestId int not null,
CellId int not null,
valveid int not null,
op1 numeric(5,2) not null,
op2 numeric (5,2) not null
)
go
CREATE FUNCTION GetOutputString
(
@TestId INT,
@CellId INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @output VARCHAR(1000)
SELECT @output = ISNULL(@output + ';','')
+
CAST(valveid AS VARCHAR(5)) + '#'
+
CAST(op1 as VARCHAR(10))+ ','
+
CAST(op2 as VARCHAR(10))
FROM TestTable
WHERE TestId = @testid
AND cellid = @cellid
RETURN @output
END
go
-- insert dummy data
INSERT INTO TestTable
SELECT 1, 1, 1, 2.5, .12
UNION
SELECT 1, 1, 2, 2.8, .13
UNION
SELECT 1, 2, 1, 3.2, .12
UNION
SELECT 1, 2, 2, 3.5, .12
UNION
SELECT 1, 2, 4, 4.5, .13
-- create temp table/table variable depending on the size of the actual table.
DECLARE @tmp TABLE (
TestId int not null,
CellId int not null,
OutputString VARCHAR(1000) null
)
INSERT INTO @tmp (TestId, CellId)
SELECT TestId, CellId
FROM TestTable
GROUP BY TestId,CellId
UPDATE @tmp
SET OutputString = dbo.GetOutputString(TestId, CellId)
SELECT * FROM @tmp
rollback
Он возвращает возвращаемые через точку с запятой значения выходных значений для каждого клапана.Конечно, во внешнем интерфейсе вам нужно будет написать код, который идентифицирует valveid как число между точкой с запятой (;) и хешем (#).Вот вывод, который производит вышеупомянутый SQL:
1 1 1#2.50,0.12;2#2.80,0.13
1 2 1#3.20,0.12;2#3.50,0.12;4#4.50,0.13