Получить имена столбцов из первой строки таблицы SQL Server - PullRequest
0 голосов
/ 11 октября 2018

У меня есть 2 таблицы. В первой таблице имена полей имеют структуру ниже.

CREATE TABLE [dbo].[FieldNames](
    [SiteId] [int] NULL,
    [Column_1] [nvarchar](50) NULL,
    [Column_2] [nvarchar](50) NULL,
    [Column_3] [nvarchar](50) NULL,
    [Name] [nvarchar](50) NULL
) ON [PRIMARY]

Эта таблица содержит данные ниже

1   FirstName   LastName    City    Coutry
2   City        Coutry      Name    Gender

У меня есть другая таблица, в которой значения столбцов имеют структуру ниже.

CREATE TABLE [dbo].[FieldValue](
    [RowId] [int] NULL,
    [SiteId] [int] NULL,
    [Column1_Value] [nvarchar](50) NULL,
    [Column2_Value] [nvarchar](50) NULL,
    [Column3_Value] [nvarchar](50) NULL,
    [Name] [nvarchar](50) NULL
) ON [PRIMARY]

Эта таблица содержит следующие данные.

1   1   ABC     XYZ     Ahmedaad    India
2   1   Hello   Smith   Kodiar  India
3   2   Ahmedaad    India   Happy   data

Я хочу получить результат, подобный приведенному ниже для siteid = 1

**FirstName     LastName     City     Coutry**
ABC             XYZ          Ahmedaad India
Hello           Smith        Kodiar   India

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Я бы предложил создавать соответствующие (динамические) запросы через другой SQL-запрос и выполнять их в цикле (или отдельно, если требуется).Следующий запрос предоставит вам динамические операторы:

SELECT DISTINCT fv.[SiteId],
'SELECT     fv.RowId, ' +
'fv.SiteId, ' +
'fv.Column1_Value AS ' + fn.Column_1 + ', ' +
'fv.Column2_Value AS ' + fn.Column_2 + ', ' +
'fv.Column3_Value AS ' + fn.Column_3 + ', ' +
'fv.Name ' +
'FROM [dbo].[FieldValue] fv ' +
'WHERE fv.SiteId = ' + CAST(fv.[SiteId] AS varchar(10)) AS stmt

FROM [dbo].[FieldValue] fv
JOIN [dbo].[FieldNames] fn ON fv.SiteId = fn.SiteId
0 голосов
/ 11 октября 2018

Вам действительно нужно использовать такой дизайн?Это может быть гибко, но кодирование, разработка, отладка и обслуживание будут кошмаром.

declare @siteid int = 1
declare @sql    nvarchar(max)

select  @sql    = 'SELECT '
        + '[Column1_Value] as ' + quotename([Column_1]) + ', '
        + '[Column2_Value] as ' + quotename([Column_2]) + ', '
        + '[Column3_Value] as ' + quotename([Column_3]) + '  ' + char(13)
        + 'FROM [FieldValue] v' + char(13)
        + 'WHERE v.[SiteId] = @siteid'
from    [FieldNames] n
where   n.SiteId    = @siteid

print   @sql
exec    sp_executesql @sql, N'@siteid int', @siteid
0 голосов
/ 11 октября 2018

Попробуйте это

SELECT [FirstName],
        [LastName],
        [City],
        [Coutry]
FROM [FieldNames] n
INNER JOIN [dbo].[FieldValue] v
    ON n.[SiteId]=v.[SiteId]
CROSS APPLY ( VALUES  (   v.Column1_Value,
                          v.Column2_Value,
                          v.Column3_Value,
                          v.name)
            )
dt ([FirstName],[LastName],[City],[Coutry])
WHERE n.[SiteId]=1

Результат

FirstName   LastName    City        Coutry
------------------------------------------
ABC          XYZ        Ahmedaad    India
Hello        Smith      Kodiar      India
...