Это не проверено, однако, вы должны получить то, что вы ищете:
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT ' +
STUFF((SELECT N',' + NCHAR(13) + NCHAR(10) +
N' ' + QUOTENAME(field_name)
FROM list_config
WHERE list_config.config_name = 'username'
AND list_config.visible = 'Y'
--ORDER BY ??? --without an ORDER BY the order of the columns will be random/unpredictable
FOR XML PATH(N''),TYPE).value(N'.','nvarchar(MAX)'),1,10,N'') + NCHAR(13) + NCHAR(10) +
N'FROM work_order;';
--PRINT @SQL; --your debugging best friend
EXEC sp_executesql @SQL;
Если вам нужно передать параметры, убедитесь, что вы параметризовали свой оператор sp_execute
; не вставляет значения параметров в динамический оператор.
Если вы хотите проверить, что имена столбцов являются реальными именами столбцов, вы можете использовать EXISTS
:
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT ' +
STUFF((SELECT ',' + NCHAR(13) + NCHAR(10) +
N' ' + QUOTENAME(lc.field_name)
FROM list_config lc
WHERE lc.config_name = 'username'
AND lc.visible = 'Y'
AND EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.COLUMN_NAME = lc.field_name
AND C.TABLE_NAME = N'Work_order')
--ORDER BY ???
FOR XML PATH(N''),TYPE).value(N'.','nvarchar(MAX)'),1,10,N'') + NCHAR(13) + NCHAR(10) +
N'FROM work_order;';
--PRINT @SQL; --your debugging best friend
EXEC sp_executesql @SQL;
Как работает этот ответ, он строит список всех столбцов в формате «с разделителями». Настоящая «магия», следовательно, находится в FOR XML PATH
, поэтому мы начнем там с подзапроса.
FOR XML PATH
в основном делает то, что говорит о банке, он превращает набор результатов в XML. Мы можем использовать эту функциональность для объединения всех значений из набора результатов из таблицы work_order
. Я префикс (это важно) каждое значение с N',' + NCHAR(13) + NCHAR(10) + N' '
. Это может показаться немного странным (некоторые используют только ','
), поэтому я объясню. запятая самая простая, между именами столбцов нам нужен один из них. NCHAR(13) + NCHAR(10)
- возврат каретки (символ Юникода 13) и разрыв строки (символ Юникода 10). Тогда у нас есть пробел. Я делаю это исключительно для форматирования, так как отформатированный динамический SQL намного проще справиться с проблемами, чем плохо отформатированный.
Тогда у нас есть STUFF
. Там STUFF
используется для удаления первого префикса для каждого значения field_name
(вот почему я сказал, что важно, чтобы это был префикс). Второй параметр STUFF
(в данном случае 1
) - это позиция, с которой начинается замена, а 3-й - это количество символов для замены (так, символы 1 - 10). Этот последний параметр - это то, что нужно заменить этими символами (''
). Таким образом, первый префикс (N',' + NCHAR(13) + NCHAR(10) + N' '
) заменяется на ''
.