存储过程无法弄清楚如何将结果插入现有表中

时间:2017-11-13 16:41:27

标签: sql-server stored-procedures

我已经看过很多关于此的帖子,但不幸的是我无法使用它们对我有利。像许多其他人一样,我希望获取存储过程的结果,并且作为过程的一部分,每次运行时,结果都会进入已存在的表。我无法弄清楚如何做到这一点以及如何匹配列。

例如,现有表有4列。其中2列是字符串,存储过程需要对这些值进行硬编码(每个过程的固定名称和定义)。我有4个存储过程,每个程序都需要有'名称'和'描述'在其中定义。这占现有'输出中的4列中的2列。表。剩下的两列,一个需要显示程序运行的日期时间,另一个是检查通过还是失败。

我的程序运行正常,直到输出结果。

现有的输出表,我们称之为“dbo.procedure_results'”。它有4列(checkname,description,asofdate和pass)

有4个程序,我们称之为dbo.p1,dbo。 P2 ....

当运行时的每个过程当前输出文件日期和总分配存储整数(以TB为单位)。我需要定义' checkname'和'描述'对于每个程序。 ' asofdate'可以是procuedure运行的日期时间Pass是if语句,如果返回值1和3之间的差异是X,那么Y,否则z。

我目前的程序:

ALTER PROCEDURE [dbo].[SP_DQ_SAN_Hosts_200TB_TotalCapacity]

AS
BEGIN

SELECT top 3 (CONVERT(date, day)) as Ref_Date, sum(TotalAllocated_TB)

  FROM [STORAGE_DW].[dbo].[SMART_Host_Dash]
  where TotalAllocated_TB >50
  GROUP BY cast(Day as date)
  order by CONVERT(date, day) desc

  insert into dbo.dq_check_summary 
  exec dbo.sp_dq_san_hosts_200tb_totalcapacity 

  END

程序目前输出:

Ref_Date     Allocated_TB
2017-05-29   898.868404388428
2017-04-24   1056.01000595093
2017-03-27   779.119682312012

1 个答案:

答案 0 :(得分:0)

你的目标是可疑的 - 很像是条件" TotalAllocated_TB> 50"对应于您为程序指定的名称。但是您只需更改select语句以包含所需的文字。例如,

select top 3 'what you want for checkname' as 'check name', 
'what you want for description' as 'description', 
cast([day] as date) as refdate, 
...
order by refdate;

请注意,您可以在order by子句中使用别名。不要重复表达。请注意,您正在求和并筛选所选行。你确定这个逻辑是正确的吗?过滤器在求和之前逻辑上发生?请注意,您的样本数据足以验证您的逻辑。并且编写一个不指定要插入的列的insert语句。永远!

insert into dbo.dq_check_summary (col1, col2, col3, col4)
execute dbo.blah;

由于您的过程相对简单,您可以考虑使用表值函数而不是过程。这将需要一种不同的方法,但通常可能更容易(从长远来看)。实际上,您可以创建一个视图来执行此操作 - 对于没有太多tsql经验的人来说,这可能是更好的选择。视图可以生成所需的结果集 - 然后在查询视图时决定是否要将结果插入表中。