我已经看过很多关于此的帖子,但不幸的是我无法使用它们对我有利。像许多其他人一样,我希望获取存储过程的结果,并且作为过程的一部分,每次运行时,结果都会进入已存在的表。我无法弄清楚如何做到这一点以及如何匹配列。
例如,现有表有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
答案 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经验的人来说,这可能是更好的选择。视图可以生成所需的结果集 - 然后在查询视图时决定是否要将结果插入表中。