Member 12857356 Ответов: 2

Sql server: возвращает имена столбцов на основе значений записей


Привет,


У меня есть один столик.Я хочу, чтобы имена столбцов основывались на значениях столбцов

|Field1 |Field2 |Field3 |Field4 |
|-------|-------|-------|-------|
| 1     | 0     | 0     | 1     |

теперь я хочу, чтобы имя поля содержало ноль.Возможно ли это в sql server?

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

Я пытался сделать различные объединения против sys. columns (и sys.tables), но пока безрезультатно.

2 Ответов

Рейтинг:
2

Wendelius

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

Другое дело, что если результирующий набор содержит две строки и значения для одного и того же столбца в этих строках различны? Каким должно быть имя столбца в таком случае?

[Редактировать:]
Один из способов сделать это-извлечь данные и на их основе создать запрос с пользовательскими именами столбцов.

Но для этого вам нужно будет один раз получить данные для определения имен столбцов, а затем снова получить данные, чтобы иметь их с пользовательскими именами столбцов. Как уже отмечалось, это не имело бы смысла. Было бы гораздо проще, например, принести данные клиенту, а затем изменить отображаемые имена по мере необходимости...

Чтобы продемонстрировать один из вариантов того, как это может быть достигнуто, рассмотрим следующее. Но, как уже было сказано, Я действительно не рекомендую этого делать.

Создание тестовых данных

CREATE TABLE ColumNameTest (
col1 int,
col2 int);

INSERT INTO ColumNameTest (col1, col2) VALUES
(1,2),
(3,null),
(null,6);

Создайте и запустите запрос
DECLARE @query nvarchar(max)
DECLARE @alias nvarchar(max)
SET @query = ' SELECT '

SELECT @alias = STUFF((SELECT ',' + COALESCE(CAST(col1 AS nvarchar(100)), 'null') FROM columnametest FOR XML PATH('')),1,1,'');
SET @query = @query + ' col1 AS [' + @alias + ']'

SELECT @alias = STUFF((SELECT ',' + COALESCE(CAST(col2 AS nvarchar(100)), 'null') FROM columnametest FOR XML PATH('')),1,1,'');
SET @query = @query + ', col2 AS [' + @alias + ']'

SET @query = @query + ' FROM ColumNameTest'
PRINT @query
EXEC sp_executesql @query

Динамически построенный запрос будет выглядеть следующим образом
SELECT  col1 AS [1,3,null], col2 AS [2,null,6] FROM ColumNameTest

и вот результат
1,3,null   2,null,6
--------   --------
1          2
3          NULL
NULL       6


Member 12857356

Поэтому вы говорите, что это невозможно .?

Wendelius

Чтобы ответить на ваш комментарий, если я говорю, что это невозможно. Нет, это не так, но в большинстве ситуаций это был бы плохой подход. Взгляните на обновленный ответ.

Рейтинг:
2

Peter Leow

Не все, что можно сделать, должно быть сделано. Почему вы хотите это сделать? Представьте, что у вас есть ряд данных без какого-либо заголовка, например [1,0,0,4], что представляет собой каждый элемент?
Другой сценарий, как вы храните свои контакты в телефоне, вы храните только номер телефона или имя контакта и номер телефона? Почему именно последнее? Вы получили ответ. Вывод таков: Не делай этого.


Member 12857356

Спасибо, \

Но в моем случае я хочу, чтобы имя столбца основывалось на N значениях ...

Peter Leow

Если только вы не ищете https://www.codeproject.com/Tips/500811/Simple-Way-To-Use-Pivot-In-SQL-Query