Как выбрать значения строк в качестве имен столбцов другой таблицы? - PullRequest
0 голосов
/ 20 марта 2019

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

мой первый запрос:

SELECT field_name
FROM list_config
WHERE list_config.config_name = 'username'
  AND list_config.visible = 'Y';

возвращает имена столбцов:

field_name (header)

create_date       
customer_id       
id                
update_date       
update_user_id    
short_description    
ops_note          
create_user_id    
resp_user_id      
activity_status_id

Затем я хочу запросить таблицу work_order только для этих столбцов, созданных первым запросом.

Я все еще новичок в SQL.помощь будет потрясающей.я пытался возиться с переменными и некоторыми процедурами, но на данный момент я просто не знаю достаточно.

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Это не проверено, однако, вы должны получить то, что вы ищете:

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' ') заменяется на ''.

0 голосов
/ 20 марта 2019

Это еще один подход (это не проверено)

declare @query nvarchar(1000) = ''

select @query = @query+',['+field_name+']'
FROM list_config
WHERE list_config.config_name = 'username'
  AND list_config.visible = 'Y';

 set @query =substring(@query,2,len(@query))

 set @query ='select '+@query + ' from work_order'

exec (@query)

Вы можете создать любой скрипт с помощью этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...