【问题标题】:Get Dynamic Pivot Result into temp table SQL Server获取动态数据透视结果到临时表 SQL Server
【发布时间】:2019-03-05 00:14:05
【问题描述】:

我想将动态数据透视结果放入临时表中,通过它我可以使用选择查询将其发送回 C# 代码。

DECLARE @partymasterid bigint = 2;
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query  AS NVARCHAR(MAX);

SELECT 
    @cols = STUFF((SELECT DISTINCT '[' + CAST(dbo.InventoryProductMaster.Name AS nvarchar(max)) + '],' 
                   FROM dbo.InventoryBiltyMaster 
                   INNER JOIN dbo.InventoryPartyProductPriceMaster ON dbo.InventoryBiltyMaster.InventoryPartyProductPriceMasterID = dbo.InventoryPartyProductPriceMaster.ID 
                   INNER JOIN dbo.InventoryProductMaster ON dbo.InventoryPartyProductPriceMaster.InventoryProductMasterID = dbo.InventoryProductMaster.ID 
                   WHERE dbo.InventoryBiltyMaster.PartyMasterID = @partymasterid 
                   FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 0, '');

SELECT @query = 
'
SELECT
*
FROM 
(SELECT
Count(dbo.InventoryBiltyMaster.ID) AS BiltyCount,
--dbo.InventoryBiltyMaster.InventoryProductMasterID,
--dbo.InventoryBiltyMaster.VehicleMasterID,
dbo.InventoryProductMaster.Name,
dbo.VehicleMaster.VehicleNumber

FROM
dbo.InventoryBiltyMaster
INNER JOIN dbo.InventoryPartyProductPriceMaster ON dbo.InventoryBiltyMaster.InventoryPartyProductPriceMasterID = dbo.InventoryPartyProductPriceMaster.ID
INNER JOIN dbo.InventoryProductMaster ON dbo.InventoryPartyProductPriceMaster.InventoryProductMasterID = dbo.InventoryProductMaster.ID
INNER JOIN dbo.VehicleMaster ON dbo.InventoryBiltyMaster.VehicleMasterID = dbo.VehicleMaster.ID
WHERE
dbo.InventoryBiltyMaster.PartyMasterID = ' + CAST(@partymasterid as nvarchar(50)) + '
GROUP BY
dbo.InventoryBiltyMaster.InventoryProductMasterID,
dbo.InventoryProductMaster.Name,
dbo.InventoryBiltyMaster.VehicleMasterID,
dbo.VehicleMaster.VehicleNumber
)
AS S
PIVOT
(
    MAX(BiltyCount)
    FOR [Name] IN (' + LEFT(@cols, LEN(@cols)-1) + ')
)AS pvt';

EXEC SP_EXECUTESQL @query

这里的结果可能有 3 列或 5 列或 10-15 列。这取决于查询的结果。这个结果我想在临时表上使用更多的数据。 我想在存储过程中使用它来将结果发送回带有实体框架的 ASP.NET MVC 5

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    在使用sp_executesql 时,如果不将其定义在父范围内,则不能将其存储在#(临时表)中。在您的情况下,您有一个动态的pivot,但您不知道那里会有什么以及有多少列。

    sp_executesql 在不同的会话中运行(sp_executesql 创建自己的会话)并且临时表是特定于会话的。

    对于您的方案,您可以使用##(全局临时表)。您可以更改查询,如下所示。

    SELECT @query = 
    '
    SELECT
    * into ##temp
    FROM 
    (SELECT
    Count(dbo.InventoryBiltyMaster.ID) AS BiltyCount,
    --dbo.InventoryBiltyMaster.InventoryProductMasterID,
    --dbo.InventoryBiltyMaster.VehicleMasterID,
    dbo.InventoryProductMaster.Name,
    dbo.VehicleMaster.VehicleNumber
    
    FROM
    dbo.InventoryBiltyMaster
    INNER JOIN dbo.InventoryPartyProductPriceMaster ON dbo.InventoryBiltyMaster.InventoryPartyProductPriceMasterID = dbo.InventoryPartyProductPriceMaster.ID
    INNER JOIN dbo.InventoryProductMaster ON dbo.InventoryPartyProductPriceMaster.InventoryProductMasterID = dbo.InventoryProductMaster.ID
    INNER JOIN dbo.VehicleMaster ON dbo.InventoryBiltyMaster.VehicleMasterID = dbo.VehicleMaster.ID
    WHERE
    dbo.InventoryBiltyMaster.PartyMasterID = ' + CAST(@partymasterid as nvarchar(50)) + '
    GROUP BY
    dbo.InventoryBiltyMaster.InventoryProductMasterID,
    dbo.InventoryProductMaster.Name,
    dbo.InventoryBiltyMaster.VehicleMasterID,
    dbo.VehicleMaster.VehicleNumber
    )
    AS S
    PIVOT
    (
        MAX(BiltyCount)
        FOR [Name] IN (' + LEFT(@cols, LEN(@cols)-1) + ')
    )AS pvt';
    
    EXEC SP_EXECUTESQL @query
    --now you can use ##temp
    

    注意:如果全局临时表从多个会话中更新,则使用全局临时表可能会导致不可预知的行为,您可以考虑为每个会话指定一个唯一名称。

    【讨论】:

    • 感谢@PSK 的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    • 2012-06-10
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多