替代在视图中调用存储过程?

时间:2012-06-04 15:56:51

标签: sql sql-server tsql

我创建了一个查询某些交易信息的查询。时间段条件是有条件的 - 在本月5日,它需要查看上个月的第16天 - 最后一天。在本月20日,它需要查看同月的第1-15天。它会自动运行。 Stack Overflow上的一位优秀绅士或女士给了我以下存储过程,它完美无缺:

DECLARE @today SMALLDATETIME, @start SMALLDATETIME, @end SMALLDATETIME; 
SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));

SET @start = DATEADD(DAY, 1-DAY(@today), @today); 
SET @end = DATEADD(DAY, 15, @start);  

IF DATEPART(DAY, @today) <= 15 
BEGIN     
    SET @start = DATEADD(MONTH, -1, @end);     
    SET @end = DATEADD(DAY, 1-DAY(@today), @today); 
END   

SELECT ... WHERE h.billed_date >= @start AND h.billed_date < @end; 

现在,他们希望将其转换为可以从第三方数据集成工具访问的视图。谷歌告诉我,视图无法调用SQL Server中的存储过程。他们的DBA表示整个查询也可以转换为存储过程。如何将查询转换为SP,以便数据集成工具可以访问它?这是查询的简化版本。

SELECT
  c.customer_name
, cc.category_name
, h.acct_bal  

FROM 
customer c
inner join htransactions h on c.customer_id = h.customer_id
left outer join customer_category cc on cc.category_id = c.category_id

WHERE
h.billed date >= @start
AND h.billed date < @end

感谢。我是一名商业分析师,试图在SQL方面做得更好。我的基础查询SQL越来越强大。我需要转换以了解有关变量和存储过程的更多信息。

1 个答案:

答案 0 :(得分:1)

如果这只是一个存储过程,那么:

CREATE PROCEDURE dbo.PullData -- whatever
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @today SMALLDATETIME, @start SMALLDATETIME, @end SMALLDATETIME; 

    SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP));

    SET @start = DATEADD(DAY, 1-DAY(@today), @today); 
    SET @end = DATEADD(DAY, 15, @start);  

    IF DATEPART(DAY, @today) <= 15 
    BEGIN     
        SET @start = DATEADD(MONTH, -1, @end);     
        SET @end = DATEADD(DAY, 1-DAY(@today), @today); 
    END   

    SELECT ... WHERE h.billed_date >= @start AND h.billed_date < @end; 
END
GO