Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用pivotsql的动态列名_Sql_Sql Server_Tsql - Fatal编程技术网

使用pivotsql的动态列名

使用pivotsql的动态列名,sql,sql-server,tsql,Sql,Sql Server,Tsql,大家好,我对SQL还比较陌生,在线搜索还没有为我提供解决方案,或者它就在我面前,但超出了我的知识范围:/。希望能在这里碰碰运气,谢谢 Table: Servers Columns: ServerUrl ServerName Rows: //server0001/space0/ Telescope1 //server0001/space1/ Space //server0001/space2/ Planet

大家好,我对SQL还比较陌生,在线搜索还没有为我提供解决方案,或者它就在我面前,但超出了我的知识范围:/。希望能在这里碰碰运气,谢谢

Table:   Servers
Columns: ServerUrl               ServerName
Rows:    //server0001/space0/    Telescope1
         //server0001/space1/    Space
         //server0001/space2/    Planet

Table:   Projects
Columns: ServerUrl               Name          Entity     Type
Rows:    //server0001/space0/    Field1        E          T1
         //server0001/space1/    Field2        T          T1
         //server0001/space2/    Field3        E          T3
通过下面的存储过程,我能够以如下方式返回数据:

因此,ServerUrl被用作列名,如下所示,但我希望它改为ServerName。我知道可以将列设置为ServerName,但由于ServerUrl可能会更改,我将如何动态地进行设置

--- Returned Data Begin ---
Stored Procedure Results:
Columns: Name    Entity  //server0001/space0/   ...space1  ...space2
Rows:    Field1  E       T1                     NULL       NULL
         Field2  T       NULL                   T2         NULL
         Field3  E       NULL                   NULL       T3     

--- Returned Data End ---
***下面的存储过程用于获取上面的结果

--- STORED PROCEDURE BEGIN ---
DECLARE @Projects varchar(max)
SELECT @ProgramList = COALESCE(@Projects + '], [', '') + ServerURL FROM
Servers ORDER BY ServerURL

SET @ProgramList = CONCAT ('[', @ProgramList + ']')

DECLARE @sql nvarchar(max)
SET @sql = 'select * from ( select P.Name, P.Entity, P.Field, P.ServerUrl 
FROM ProjectFields as P ) as P pivot (min(P.Field) for P.ServerUrl in (' + 
@Projects + ')) as PIV ORDER BY Name'

EXEC sp_executesql @sql1
--- STORED PROCEDURE END ---

谢谢:

您的存储过程看起来不完整或更改了某些内容,但我相信您正在寻找以下内容:

DECLARE @ProgramList VARCHAR(MAX);
SELECT @ProgramList = STUFF((SELECT ',' + QUOTENAME(ServerName) FROM [Servers] ORDER BY ServerURL FOR XML PATH ('')), 1, 1, '');

DECLARE @sql VARCHAR(MAX);
SELECT @sql = '
SELECT *
FROM
(
    SELECT P.Name,
           P.Entity,
           P.Field,
           S.ServerName
    FROM ProjectFields AS P
    JOIN [Servers] AS S
        ON S.ServerURL = P.ServerURL
) AS P
PIVOT
(
    MIN(Field) FOR ServerName IN (' + @ProgramList + ')
) AS PIV
ORDER BY PIV.Name;';

--PRINT @sql;
EXEC sp_executesql @sql;

将@ProgramList select更改为ServerName而不是ServerURL,并将动态语句更改为类似“select*FROM select P.Name、P.Entity、P.Field、S.ServerName FROM ProjectFields AS P JOIN Servers AS S ON S.ServerURL=P.ServerURL AS P PIVOT MINField FOR ServerName IN'+@ProgramList+'AS PIV ORDER BY PIV.Name;”非常感谢ZLK,它很有魅力,是的,你是对的,我改变了一些事情,对不起。