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



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

是否可以创建一个视图,在这些表上使用UNION并输出第四列,该列是键值对的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

然后View会将其输出为

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)

干杯

Stewart

假设这是您的

模式

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

您也可以在SQLFiddle中查看

输出

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

最新更新