Alex2 101 Ответов: 1

Как получить столбцы, перечисленные в одной строке, используя coalesce в SQL?


Я использую динамический запрос и пытаюсь извлечь столбцы в одной строке с помощью функции COALESCE. Но это не работает

Что я уже пробовал:

ОБЪЯВИТЬ @COLUMNS NVARCHAR(3000)
SET @COLUMNS = ' SELECT
COALESCE ('+@COLUMNS+' + ",", ") +
См.Имя_столбца
От ICCS_StdReportTable_Master TM
внутреннее соединение
ICCS_StdReport_Column_Master см
на СМ.TableId=ТМ.TableId
где
ТМ.RecordIdentifierKeyword в (
выберите подстроку (VALUE, TM. StartPosition, TM.Length) из ICCS_MENUS MNU
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ICCS_StdReportTable_Master ТМ
НА ТМ.Имятаблицы=подстрока(значение,ТМ.StartPosition,ТМ.Длина)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ICCS_SCREENS SC
НА СК.SCREENID=МНУ.SCREENID'

1 Ответов

Рейтинг:
0

CHill60

"не работает" не очень полезно и делает его более трудным для нас, чтобы помочь вам! Всегда полезно сначала сделать запрос как можно более простым - заставить что-то работать, а затем добавить сложность позже. Таким образом, вы можете включить некоторые примеры данных и схемы таблиц. Эти вещи делают ваш вопрос лучше, что означает, что он с большей вероятностью получит быстрый ответ.

Впрочем, к твоей проблеме ... Я продемонстрирую, что происходит с этой очень простой таблицей:

eate table [ColumnNames]
(
	id INT IDENTITY(1,1),
	ColumnName varchar(125)
)
INSERT INTO ColumnNames values ('COL1'),('COL2'),('COL3')

Если я делаю что-то похожее на ваш запрос, я получаю этот запрос:
DECLARE @columns NVARCHAR(MAX) = 'SELECT '
SELECT @columns = COALESCE(@columns+',' ,'') + CAST(ColumnName AS Varchar)
FROM ColumnNames
PRINT @columns
Но когда я запускаю этот запрос, я получаю результаты:
SELECT ,COL1,COL2,COL3
Заметьте эту лишнюю запятую после SELECT но прежде COL1 Это вызовет синтаксическую ошибку в конечном запросе. Вы не должны удивляться, что он есть, когда вы пытаетесь добавить запятую в конец @columns для каждого значения, возвращаемого из таблицы! Если @columns уже содержит данные, то SQL поставит запятую в конце этого первого.

Если я изменю запрос на этот
DECLARE @columns NVARCHAR(MAX) = null
SELECT @columns = COALESCE(@columns+',' ,'') + CAST(ColumnName AS Varchar)
FROM ColumnNames
тогда я получаю
COL1,COL2,COL3
Теперь проблема заключается в том, как собрать воедино остальную часть вашего запроса. Мое личное предпочтение состоит в том, чтобы иметь отдельную переменную для списка столбцов и окончательного sql, например
DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT ' + @columns + ' ... the rest of your query'
Даже если вы не хотите этого делать это все равно двухэтапный запрос -
DECLARE @columns NVARCHAR(MAX) = null
SELECT @columns = COALESCE(@columns+',' ,'') + CAST(ColumnName AS Varchar)
FROM ColumnNames
set @columns = 'SELECT ' + @columns + '... the rest of your query'