SQL Server T-SQL:使用存储过程自动重新生成SQL报告

时间:2017-05-05 17:50:49

标签: sql-server tsql stored-procedures

目标:创建一个自动执行此报告的存储过程,以便在运行execute NameOfStoredProc时,它会执行所有3个块并返回块3中的查询。

对于表格,我希望它基于getdate()是动态的。

(我没有发布实际的表元素和记录,但如果需要我可以编写一些b / c实际数据是敏感的)

  • 数据库:FY1516
  • 从表格:v_all_claim(实际上是一个视图)
  • 进入表格:March2017_Payments

这是我手动执行以生成报告的代码。

第1区:

--creates payment table
SELECT Recipient_ID, DOP, Provider_ID, program_code, poverty_code 
INTO FY1516..March2017_Payments
FROM FY1516..v_all_Claim
WHERE amount <> 0 
  AND DOP BETWEEN '20170301' AND '20170331'

第2栏:

-- add one column to the table created in block 1, sets default value to '' and update to Y 
-- if certain constraints are met
ALTER TABLE FY1516..March2017_Payments
    ADD TITLE21_Flag varchar(1);
GO 

UPDATE FY1516..March2017_Payments
SET TITLE21_Flag = ''
GO 

UPDATE FY1516..March2017_Payments
SET TITLE21_Flag = 'Y'
WHERE program_code IN ('A', 'B', 'C')
使用复制到Excel中的select语句

Block 3

SELECT * 
FROM FY1516..March2017_Payments

到目前为止我的尝试:

  • @start@end适用于between @start and @end
  • @previousMonth提供上个月的前3个字母
  • @previousMonthYear给出了上个月的YYYY

希望@previousMonth +@previousMonthYear +"_Payments"可以是表名

USE FY1516

CREATE PROCEDURE NameOfStoredProc
AS
    DECLARE @start VARCHAR(8), @end VARCHAR(8),
            @previousMonth VARCHAR(3), @previousMonthYear VARCHAR(4);

    SET @start = CONVERT(VARCHAR(8), DATEADD(MONTH, DATEDIFF(MONHT, 0, GETDATE()) - 1, 0), 112)
    SET @end = CONVERT(VARCHAR(8), DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE()) - 1, -1), 112)

    SET @previousMonth = LEFT(DATENAME(MONTH, DATEADD(MONTH, -1, GETDATE())), 3)
    SET @previousMonthYear = YEAR(DATEADD(MONTH, -1, GETDATE()))

1 个答案:

答案 0 :(得分:1)

您可以将Block 1和Block 2合并为一个语句:

--creates payment table
Select Recipient_ID
, DOP
, Provider_ID
,program_code
,poverty_code 
,TITLE21_Flag = CASE WHEN program_code IN ('A','B','C') THEN 'Y' ELSE '' END
INTO FY1516..March2017_Payments
FROM FY1516..v_all_Claim
WHERE amount <> 0 and DOP between '20170301' and '20170331'

然后,在proc中,您可以使用动态SQL来创建表。这是一个例子:

Create procedure NameOfStoredProc
AS
declare @start varchar(8)
, @end varchar(8)
,@previousMonth varchar(3)
,@previousMonthYear varchar(4);

set @start = convert(varchar(8),dateadd(month, datediff(month,0,getdate())-1,0),112)
set @end = convert(varchar(8),DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1),112)
set @previousMonth =  left(datename(month, dateadd(month,-1,getdate())), 3)
set @previousMonthYear = year(dateadd(month,-1,getdate()))

DECLARE @SQLString NVARCHAR(MAX) = 'CREATE TABLE ' + @previousMonth +@previousMonthYear +'_Payments (ColA int)'
EXECUTE sp_executesql @SQLString

您希望将(ColA int)替换为您的实际列名和数据类型。

编辑:

这是一个包含Block 1/2进入存储过程的示例。它首先检查表的存在,然后运行相应的SELECT查询。

CREATE PROCEDURE NameOfStoredProc
AS
begin
declare @start varchar(8)
, @end varchar(8)
,@previousMonth varchar(3)
,@previousMonthYear varchar(4);

set @start = convert(varchar(8),dateadd(month, datediff(month,0,getdate())-1,0),112)
set @end = convert(varchar(8),DATEADD(MONTH, DATEDIFF(MONTH, -1, GETDATE())-1, -1),112)
set @previousMonth =  left(datename(month, dateadd(month,-1,getdate())), 3)
set @previousMonthYear = year(dateadd(month,-1,getdate()))

DECLARE @SQLString NVARCHAR(MAX) = 
'IF OBJECT_ID('''+@previousMonth +@previousMonthYear +'_Payments'', ''U'') IS NOT NULL 
BEGIN
    print 1
    INSERT INTO FY1516..'+ @previousMonth +@previousMonthYear +'_Payments
    Select Recipient_ID
    , DOP
    , Provider_ID
    ,program_code
    ,poverty_code 
    ,TITLE21_Flag = CASE WHEN program_code IN (''A'',''B'',''C'') THEN ''Y'' ELSE '''' END
    FROM FY1516..v_all_Claim
    WHERE amount <> 0 and DOP between ''20170301'' and ''20170331''
END
ELSE
BEGIN
print 2
    Select Recipient_ID
    , DOP
    , Provider_ID
    ,program_code
    ,poverty_code 
    ,TITLE21_Flag = CASE WHEN program_code IN (''A'',''B'',''C'') THEN ''Y'' ELSE '''' END
    INTO FY1516..'+ @previousMonth +@previousMonthYear +'_Payments
    FROM FY1516..v_all_Claim
    WHERE amount <> 0 and DOP between ''20170301'' and ''20170331''
END
'
EXECUTE sp_executesql @SQLString

SET @SQLString = 'SELECT * FROM '+@previousMonth +@previousMonthYear +'_Payments'
EXECUTE sp_executesql @SQLString
END