Получить список имен и значений столбцов таблицы - PullRequest
1 голос
/ 29 апреля 2019

У меня есть таблица, в которой есть несколько полей и значений. Я пытаюсь получить список имен и значений столбцов таблицы (пары имя-значение столбца).

Например, у меня ниже таблица с полями и значениями:

MyTable:

Field1 Field2 Field3 .... FieldN
 89      34     10          233

Итак, я хочу получить таблицу ниже (имя поля - пара значений поля):

FieldName  FieldValue
Field1     89
Field2     34
Field3     10
...
FieldN     233

Я имею в виду таблицу с двумя полями: FieldName как текст и FieldValue как номер.

Чтобы получить список имен столбцов таблицы, я выполняю ниже:

SELECT NAME  FROM  sys.columns  WHERE object_id = OBJECT_ID('schema.MyTable')

но я не знаю, как получить значение для каждого имени столбца. Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Одним из возможных подходов является генерация динамического оператора с использованием UNPIVOT. Если столбцы имеют разные типы данных, используйте CONVERT:

Введите:

CREATE TABLE Data (
   ColumnVarchar varchar(100),
   ColumnDateTime datetime,
   ColumnInt int
)
INSERT INTO Data
   (ColumnVarchar, ColumnDateTime, ColumnInt)
VALUES
   ('Some text 1', GETDATE(), 1)

Заявление:

-- Declarations
DECLARE @stm nvarchar(max)
DECLARE @names nvarchar(max)
DECLARE @values nvarchar(max)

-- Dynamic part 
SELECT 
   @values = STUFF((
      SELECT CONCAT(N', CONVERT(varchar(max), ', QUOTENAME([COLUMN_NAME]), N') AS ', QUOTENAME([COLUMN_NAME]))
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = 'Data'
      FOR XML PATH('')
   ), 1, 1, N''),
   @names = STUFF((
      SELECT CONCAT(N', ', QUOTENAME([COLUMN_NAME]))
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = 'Data'
      FOR XML PATH('')
   ), 1, 1, N'')

-- Whole statement and execution
SELECT @stm = 
   CONCAT(
      N'SELECT u.FieldName, u.FieldValue FROM (SELECT',
      @values,
      N'FROM Data) d UNPIVOT ([FieldValue] FOR [FieldName] IN (',
      @names,
      N')) u')
EXEC (@stm)      

Выход:

-----------------------------------
FieldName       FieldValue
-----------------------------------
ColumnVarchar   Some text 1
ColumnDateTime  Apr 29 2019  1:45PM
ColumnInt       1 

Обновить - сохранить результаты в другую таблицу:

-- Whole statement and execution
SELECT @stm = 
   CONCAT(
      N'SELECT u.FieldName, u.FieldValue INTO ResultTable FROM (SELECT',
      @values,
      N'FROM Data) d UNPIVOT ([FieldValue] FOR [FieldName] IN (',
      @names,
      N')) u')
EXEC (@stm)

SELECT * 
FROM ResultTable      
1 голос
/ 29 апреля 2019

Для динамического использования столбцов необходимо использовать динамический запрос, а размер столбца должен быть одинаковым для решения проблемы Column conflicts with the type of other columns in the unpivot list. Я нашел это очень утомительным, хотя это очень полезно в вашем случае

CREATE TABLE test (Field1 INT, Field2 INT, Field3 INT, FieldN INT, flag CHAR(1))
INSERT INTO test VALUES
(89,34,10,233, 'i')

DECLARE @sql NVARCHAR(MAX) = N'',
    @colIn NVARCHAR(MAX) = N'',
    @colSelect NVARCHAR(MAX) = N''

SELECT 
@colIn += ', ' + QUOTENAME(name),
@colSelect += ',' + QUOTENAME(name) + ' = CONVERT(VARCHAR(255), ' + QUOTENAME(name) + ')'
FROM sys.columns 
WHERE object_id = OBJECT_ID('test')

SET @sql = '
SELECT a.FieldName, a.FieldValue
FROM (SELECT ' + STUFF(@colSelect, 1, 1, '') + '
    FROM test) t
UNPIVOT([FieldValue] FOR [FieldName] IN (' + STUFF(@colIn, 1, 1, '') + ')) a '

EXEC(@sql)

OUTPUT

FieldName   FieldValue
Field1      89
Field2      34
Field3      10
FieldN      233
flag        i
...