目标:创建一个自动执行此报告的存储过程,以便在运行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()))
答案 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