Dynamic 如何在SQLServer2008中使用数据表创建动态列?

Dynamic 如何在SQLServer2008中使用数据表创建动态列?,dynamic,sql-server-2008-r2,pivot,Dynamic,Sql Server 2008 R2,Pivot,在sql server 2008中,我有如下四个表: 表1->用户 UserID UserName ----------------------- 1 Jhon 表2->电话簿 PhonebookID UserID Name

在sql server 2008中,我有如下四个表:

表1->用户

                     UserID        UserName
                     -----------------------
                       1              Jhon
表2->电话簿

                     PhonebookID        UserID            Name             MobileNumber
                     -------------------------------------------------------------------
                       1                  1               MyBrother              252848
表3->PhonebookExtraField

                     PhonebookExtraFieldID        UserID            ExtraFieldName    
                     -------------------------------------------------------------
                             1                      1               Age     
                             2                      1               Job
                             3                      1               Address    
表4->phoneBookExtraFieldData

phoneBookExtraFieldDataID    PhonebookExtraFieldID    PhonebookID    ExtraFieldValue    
-----------------------------------------------------------------------------------------
         101                             1                  1               30
         102                             2                  1               Web Developer
         103                             3                  1               A.V. Rose
如何为下面的输出编写查询:
意思是我正在寻找一种使用数据表创建动态列的方法

UserName  Phonebook(Name)  Phonebook(MobileNumber)  Age       Job           Address
-------------------------------------------------------------------------------------
Jhon          MyBrother            252848            30    Web Developer    A.V. Rose
做这项工作的最佳方式是什么?
为此,我应该如何更改表格?
感谢您的关注和进步

Select 
    * 
from 
    user as u, 
    PhoneBook as pb,
    PhonebookExtraField as pbf, 
    phoneBookExtraFieldData as pbdf 
 where 
    u.userid=pb.userID 
    and pb.userID=pbf.userID 
    and pbf.PhonebookExtraFieldID =pfbd.PhonebookExtraFieldID
and u.Username='Jhon'
将*替换为所需的列名


将*替换为所需的列名。

可能是这样的:

测试数据

CREATE TABLE #User
(
    UserID INT,
    UserName VARCHAR(100)
)
INSERT INTO #User
VALUES(1,'Jhon')
CREATE TABLE #PhoneBook
(
    PhonebookID INT,
    UserID INT,
    Name VARCHAR(100),
    MobileNumber INT
)
INSERT INTO #PhoneBook
VALUES(1,1,'MyBrother',252848)
CREATE TABLE #PhonebookExtraField
(
    PhonebookExtraFieldID INT,
    UserID INT,
    ExtraFieldName VARCHAR(100)
)
INSERT INTO #PhonebookExtraField
VALUES(1,1,'Age'),(2,1,'Job'),(3,1,'Address')
CREATE TABLE #PhoneBookExtraFieldData
(
    PhoneBookExtraFieldDataID INT,
    PhonebookExtraFieldID INT,
    PhonebookID INT,
    ExtraFieldValue VARCHAR(100)
)
INSERT INTO #PhoneBookExtraFieldData
VALUES(101,1,1,'30'),(102,2,1,'Web Developer'),(103,3,1,'A.V. Rose')
查找动态列

DECLARE @cols VARCHAR(MAX)
SELECT  @cols = COALESCE(@cols + ','+QUOTENAME(ExtraFieldName),
                     QUOTENAME(ExtraFieldName))
FROM 
    #PhonebookExtraField
使用数据透视执行一些动态sql:

DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(
    SELECT
        #User.UserName,
        #PhoneBook.Name AS [Phonebook(Name)],
        #PhoneBook.MobileNumber AS [Phonebook(MobileNumber)],
        #PhonebookExtraField.ExtraFieldName,
        #PhoneBookExtraFieldData.ExtraFieldValue
    FROM
        #User
        JOIN #PhoneBook
            ON #User.UserID=#PhoneBook.UserID
        JOIN #PhonebookExtraField
            ON #PhoneBook.UserID=#PhonebookExtraField.UserID
        JOIN #PhoneBookExtraFieldData
            ON #PhonebookExtraField.PhonebookExtraFieldID=#PhoneBookExtraFieldData.PhonebookExtraFieldID
) AS p
PIVOT
(
    MAX(ExtraFieldValue)
    FOR ExtraFieldName IN('+@cols+')
) AS pvt'
EXECUTE(@query)
然后我会自己打扫干净:

DROP TABLE #User
DROP TABLE #PhoneBook
DROP TABLE #PhonebookExtraField
DROP TABLE #PhoneBookExtraFieldData

也许是这样的:

测试数据

CREATE TABLE #User
(
    UserID INT,
    UserName VARCHAR(100)
)
INSERT INTO #User
VALUES(1,'Jhon')
CREATE TABLE #PhoneBook
(
    PhonebookID INT,
    UserID INT,
    Name VARCHAR(100),
    MobileNumber INT
)
INSERT INTO #PhoneBook
VALUES(1,1,'MyBrother',252848)
CREATE TABLE #PhonebookExtraField
(
    PhonebookExtraFieldID INT,
    UserID INT,
    ExtraFieldName VARCHAR(100)
)
INSERT INTO #PhonebookExtraField
VALUES(1,1,'Age'),(2,1,'Job'),(3,1,'Address')
CREATE TABLE #PhoneBookExtraFieldData
(
    PhoneBookExtraFieldDataID INT,
    PhonebookExtraFieldID INT,
    PhonebookID INT,
    ExtraFieldValue VARCHAR(100)
)
INSERT INTO #PhoneBookExtraFieldData
VALUES(101,1,1,'30'),(102,2,1,'Web Developer'),(103,3,1,'A.V. Rose')
查找动态列

DECLARE @cols VARCHAR(MAX)
SELECT  @cols = COALESCE(@cols + ','+QUOTENAME(ExtraFieldName),
                     QUOTENAME(ExtraFieldName))
FROM 
    #PhonebookExtraField
使用数据透视执行一些动态sql:

DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(
    SELECT
        #User.UserName,
        #PhoneBook.Name AS [Phonebook(Name)],
        #PhoneBook.MobileNumber AS [Phonebook(MobileNumber)],
        #PhonebookExtraField.ExtraFieldName,
        #PhoneBookExtraFieldData.ExtraFieldValue
    FROM
        #User
        JOIN #PhoneBook
            ON #User.UserID=#PhoneBook.UserID
        JOIN #PhonebookExtraField
            ON #PhoneBook.UserID=#PhonebookExtraField.UserID
        JOIN #PhoneBookExtraFieldData
            ON #PhonebookExtraField.PhonebookExtraFieldID=#PhoneBookExtraFieldData.PhonebookExtraFieldID
) AS p
PIVOT
(
    MAX(ExtraFieldValue)
    FOR ExtraFieldName IN('+@cols+')
) AS pvt'
EXECUTE(@query)
然后我会自己打扫干净:

DROP TABLE #User
DROP TABLE #PhoneBook
DROP TABLE #PhonebookExtraField
DROP TABLE #PhoneBookExtraFieldData

感谢您的回答|但是通过此查询,我们的输出中仍然有3行而不是一行。此外,我们没有年龄、职务和地址作为输出标题!感谢您的回答|但是通过此查询,我们的输出中仍然有3行而不是一行。此外,我们没有年龄、职务和地址作为输出标题!非常感谢大家的关注|哇。。。我想这正是我想要的。正在努力…没问题。。。如果你对这个答案很好,那么你可以考虑接受它吗?非常感谢大家的关注。我想这正是我想要的。正在努力…没问题。。。如果你对这个答案很好,那么你可以考虑接受它吗?