Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server T-SQL:使用存储过程自动化重复出现的SQL报告_Sql Server_Tsql_Stored Procedures - Fatal编程技术网

Sql server SQL Server T-SQL:使用存储过程自动化重复出现的SQL报告

Sql server SQL Server T-SQL:使用存储过程自动化重复出现的SQL报告,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,目标:创建一个自动执行此报告的存储过程,以便在运行execute NameOfStoredProc时,执行所有3个块并返回块3中的查询 对于into表,我希望它基于getdate()是动态的 (我没有发布实际的表元素和记录,但如果需要,我可以编写一些b/c实际数据敏感的内容) 数据库:FY1516 从表:v_all_索赔(实际上是一个视图) 进入表格:2017年3月&u付款 下面是我手动执行以生成报告的代码 第1区: --creates payment table SELECT Recipi

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

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

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

  • 数据库:
    FY1516
  • 从表:
    v_all_索赔
    (实际上是一个视图)
  • 进入表格:
    2017年3月&u付款
下面是我手动执行以生成报告的代码

第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'
块3带有复制到Excel中的select语句:

SELECT * 
FROM FY1516..March2017_Payments
我迄今为止的努力:

  • @start
    @end
    用于@start和@end之间的
  • @previousMonth
    给出上月的前3个字母
  • @previousMonthYear
    给出上月的YYYY
希望
@previousMonth+@previousMonthYear+“\u 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和块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'
您需要用实际的列名和数据类型替换
(ColA int)

编辑:

下面是一个将块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
创建存储过程的过程名称
作为
开始
声明@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()))
声明@SQLString NVARCHAR(最大值)=
'如果对象ID('''+@previousMonthYear+@previousMonthYear+''U Payments'',''U'')不为空
开始
打印1
在1516财年插入“+@previousMonth+@previousMonthYear+”\u付款
选择收件人ID
,DOP
,提供商ID
,程序代码
,贫穷![2]代码
,TITLE21_Flag=当程序在('A'、'B'、'C'中编码,然后在“Y”或“其他”中结束时的情况
自1516财年起,v_all_索赔
其中金额0和DOP介于“20170301”和“20170331”之间
结束
其他的
开始
打印2
选择收件人ID
,DOP
,提供商ID
,程序代码
,贫穷![2]代码
,TITLE21_Flag=当程序在('A'、'B'、'C'中编码,然后在“Y”或“其他”中结束时的情况
至1516财年,“+@previousMonth+@previousMonthYear+”\u付款
自1516财年起,v_all_索赔
其中金额0和DOP介于“20170301”和“20170331”之间
结束
'
执行sp_executesql@SQLString
SET@SQLString='从'+@previousMonth+@previousMonthYear+''中选择*
执行sp_executesql@SQLString
结束

那么您正在寻找一种基于@previousMonth+@previousMonthYear+“\u Payments”作为文件名动态创建表的方法?是的。这是关键部分。我有一个工作代码存储过程,它使用静态表名创建表。但是我不能在同一个过程中包含update命令,因为表不是在存储过程中创建的,而是在
execute
之后创建的。我想我可以创建第二个存储过程来执行第一个存储过程,然后更新所创建的表。请查看我的答案。您可以使用单个存储过程。使用
sp_executesql
命令后,该表将可用。但是,如果您以编程方式进行所有操作,则可能需要在动态sql中封装任何后续插入或更新。Aaron,在您提供的两段代码中,我理解这两段代码,但我不确定如何组合这两段代码。当第一个块有一个
INTO
语句时,我是否在第一个块上写一个“INSERT-INTO”,然后将整个块放在第二个块下面?如果是这样,在将
插入写入
时,我应该如何引用动态表=DI在答案中添加了另一个示例。它将块1/2中的代码合并到动态SQL中。我还添加了一个检查来查看表是否存在,因为我假设存储的proc可能在目标表不存在时运行,但也可能在目标表可能存在时运行,因此,我们必须确保只有在我们想要的表还不存在的情况下才创建新表。您提供的代码使我能够学习并创建一个工作存储过程,该过程完成了我过去为报表手动执行的所有操作。我真的很感谢你的帮助!
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
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