Я новичок в SQL и пытаюсь выяснить, как использовать значения из оператора Select в условном цикле While Exists. Цель состоит в том, чтобы объединить несколько экземпляров атрибута для документа в одно поле, а затем развернуть и объединить эти результаты с записью документа.
Например, три таблицы существуют примерно так:
Таким образом, окончательные сводные таблицы и соединения будут выглядеть так:
Условие SQL пока существует, которое я пытался написать, выглядит так:
DECLARE @LOOP_DOC_ID UNIQUEIDENTIFIER
DECLARE @LOOP_ATTRIBUTE_NAME NVARCHAR(MAX)<br>
WHILE EXISTS(
SELECT [dbo].[ATTRIBUTE_VALUES].[DOC_ID], [dbo].[ATTRIBUTES].[ATTRIBUTE_NAME]
FROM ([dbo].[ATTRIBUTE_VALUES] INNER JOIN [dbo].[ATTRIBUTES]
ON [dbo].[ATTRIBUTE_VALUES].[ATTRIBUTE_ID] = [dbo].[ATTRIBUTES].[ID])
)
BEGIN
SET @LOOP_DOC_ID = DOC_ID
SET @LOOP_ATTRIBUTE_NAME = ATTRIBUTE_NAME<br>
SELECT STUFF(
(
SELECT DISTINCT ',' + RTRIM(LTRIM([dbo].[ATTRIBUTE_VALUES].[VALUE]))
FROM
(
[dbo].[ATTRIBUTE_VALUES] INNER JOIN [dbo].[ATTRIBUTES]
ON [dbo].[ATTRIBUTE_VALUES].[ATTRIBUTE_ID] = [dbo].[ATTRIBUTES].[ID]
)
WHERE [dbo].[ATTRIBUTE_VALUES].[DOC_ID] = @LOOP_DOC_ID
AND [dbo].[ATTRIBUTES].[ATTRIBUTE_NAME] = @LOOP_ATTRIBUTE_NAME
ORDER BY ',' + RTRIM(LTRIM([dbo].[ATTRIBUTE_VALUES].[VALUE]))
FOR XML PATH('')
), 1, 2, ''
) AS VALUE, @LOOP_DOC_ID AS DOC_ID, @LOOP_ATTRIBUTE_NAME AS ATTRIBUTE_NAME
END
SQL Server не нравятся строки, в которых я пытаюсь установить переменные в значения из оператора Select в условии while Exists.
Как использовать значения [dbo]. [ATTRIBUTE_VALUES]. [DOC_ID], [dbo]. [ATTRIBUTES]. [ATTRIBUTE_NAME] Выбранные в условном выражении while Exists между операторами BEGIN и END?
Предпочтительно я хотел бы покончить с переменными @LOOP_DOC_ID и @LOOP_ATTRIBUTE_NAME и иметь дело непосредственно со значениями.
Я просматривал форумы, на которых говорилось об использовании курсоров для решения похожих проблем, но каждый из них, похоже, рекомендует использовать курсоры только в качестве крайней меры из-за недостатка скорости. Я также видел, как некоторые люди используют хранимые процедуры, но я не могу их использовать, так как мой босс считает их запрещенными. Мне нужен курсор или есть лучший способ сделать это?