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'