在SQL视图字段中将列名称/值输出为键值对

时间:2014-09-10 19:29:39

标签: sql sql-server tsql

我有一个包含多个表的数据库,这些表共享几个公共字段(ID(Guid),Title,ParentID(Guid)),但是它们中的任何一个都可以有特定于表的字段。

是否可以在这些表上创建UNIONs的视图并输出第四列,该列是键值对的JSON表示,表示除3个常用字段之外的所有其他字段的列名和值?然后,Web应用程序将使用该字段的值。它不必是JSON,它可以是XML,逗号分隔,但基本上应该代表一个或多个字段的字段名/值配对,这些字段在工会表之间不常见。

澄清。采用以下两个表模式

Table1
ID    Title    ParentID   ABooleanField    AnIntegerField
1     A Parent NULL       True             50
2     A Child  1          False            100

Table2 
ID    Title         ParentID    ADateField
3     AnotherParent NULL        10/12/2014

然后,视图将输出为

ID      Title          ParentID      Uncommon
1       A Parent       NULL          ABooleanField:True,AnIntegerField:50
2       A Child        1             ABooleanField:False,AnIntegerField:100
3       AnotherParent  NULL          ADateField:10/12/2014

ID实际上是GUID,Uncommon字段是NVARCHAR(MAX)

干杯

斯图尔特

1 个答案:

答案 0 :(得分:0)

让我们说这是你的

模式

CREATE TABLE table1 (id int, Title nvarchar(100), ParentID int, ABooleanField varchar(10), AnIntegerField int)
INSERT table1 VALUES (1, 'A Parent', null, 'true', 50), (2, 'A Child', 1, 'false', 100)

CREATE TABLE table2 (id int, Title nvarchar(100), ParentID int, ADateField varchar(100))
INSERT table2 VALUES (1, 'AnotherParent  ', null, '10/12/2014')

这是

查询

SELECT id
    ,Title
    ,ParentID
    ,(
        SELECT STUFF((
                    SELECT ',"ABooleanField": ' + ABooleanField + ',"AnIntegerField":' + cast(AnIntegerField AS VARCHAR(20))
                    FOR XML path('')
                        ,type
                    ).value('.', 'varchar(max)'), 1, 1, '')
        ) AS 'KeyValPair'
FROM table1
UNION ALL
SELECT id
    ,Title
    ,ParentID
    ,(
        SELECT STUFF((
                    SELECT ',"ADateField": ' + ADateField
                    FOR XML path('')
                        ,type
                    ).value('.', 'varchar(max)'), 1, 1, '')
        ) AS 'KeyValPair'
FROM table2

您也可以在SQL Fiddle for that中查看。

输出

ID      Title          ParentID      KeyValPair
1       A Parent       Null          ABooleanField: true, AnIntegerField:50
2       A Child        1             ABooleanField: false, AnIntegerField:100
3       AnotherParent  Null          ADateField: 10/12/2014