如何创建调用存储过程的本机查询

How to create a native query in which you call a stored procedure

我的问题主要是找不到如何通过Power BI的Direct Query数据连接方法使用存储过程的解决方案,也就是说,我想在Power BI中使用Direct Query制作报表数据集在存储过程中。

几天的阅读和咨询我找到了一个可能的解决方案(在这里他们会告诉我它是否最适合我的情况)是创建一个调用存储过程的本机查询,这是为了不使用存储过程,而是使用 Power BI 的本机查询。

按照我的想法,我必须执行本机查询的存储过程如下:

ALTER PROCEDURE [dbo].[TravelsCustomers]
    @TypeOp int = 0,
    @Customer varchar(50)
AS
BEGIN
    SET NOCOUNT ON

    SELECT  
        Estatus,
        ClaveCustomer
        Lote,
        Address,
        OC
    INTO
        #Response
    FROM    
        TravelVw V
    WHERE   
        Estatus = 'PROGRESS'
        AND TypeOp = CASE 
                         WHEN @TypeOp = 0 THEN TypeOp
                         WHEN @TypeOp = 1 THEN 'FLASH'
                         WHEN @TypeOp = 2 THEN 'SMALL'
                     END
        AND ISNULL(@Customer, '0') IN ('0', ClaveCustomer)  
        AND TypeOp != 'SALE'

    SELECT
        V.*, 
        I2.Coment, I2.MODIFIEDBY, I2.CreatedDateTime
    FROM
        #Response V
    LEFT JOIN
        (SELECT 
             I.Travel, 
             ISNULL(I.Coment, '-') Coment,
             I.ModifiedBy,
             DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), GETDATE()), I.CreatedDateTime) CreatedDateTime
         FROM
             dbo.Travel I 
         WHERE
             I.CREATEDDATETIME = (SELECT MAX(CREATEDDATETIME) 
                                  FROM dbo.I3
                                  WHERE I.Travel = I3.Travel)
        ) I2 ON V.Travel = I2.Travel
END

在这里,我希望得到您的支持,以生成本机查询或为我提供有关将存储过程与 Power BI 的直接查询一起使用的更好选择。

您可以创建一个 table 值函数,您应该可以使用 DirectQuery

访问它
CREATE OR ALTER FUNCTION [dbo].[TravelsCustomers]
(
    @TypeOp int = 0,
    @Customer varchar(50)
)
RETURNS TABLE AS RETURN

    SELECT
        V.*, 
        I2.Coment, I2.MODIFIEDBY, I2.CreatedDateTime
    FROM (
        SELECT  
            Estatus,
            ClaveCustomer
            Lote,
            Address,
            OC
        FROM    
            TravelVw V
        WHERE   
            Estatus = 'PROGRESS'
            AND (@TypeOp = 0 OR TypeOp = CASE 
                         WHEN @TypeOp = 1 THEN 'FLASH'
                         WHEN @TypeOp = 2 THEN 'SMALL'
                     END)
            AND (@CustomerIS NULL OR ClaveCustomer = @Customer)
            AND TypeOp != 'SALE'
        ) V
    LEFT JOIN
        (SELECT 
             I.Travel, 
             ISNULL(I.Coment, '-') Coment,
             I.ModifiedBy,
             DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), GETDATE()), I.CreatedDateTime) CreatedDateTime
         FROM
             dbo.Travel I 
         WHERE
             I.CREATEDDATETIME = (SELECT MAX(CREATEDDATETIME) 
                                  FROM dbo.I3
                                  WHERE I.Travel = I3.Travel)
        ) I2 ON V.Travel = I2.Travel;

GO