我有一个名为myStoredProcedure
的存储过程(SP),根据startDate
和endDate
用户定义的参数向我返回这样的输出:
PrimaryName SecondaryName Volume
A B 20
C D 30
A D 50
...
因此,Volume表示所定义日期之间所有情况的总和。
在另一个名为mySecondStoredProcedure
的SP中,我使用第一个SP来获得结果。但是,我的问题是我的输出需要一个额外的属性,year
,我希望看到基于年份的卷。因此,我希望看到的输出是那样的
假设 startDate: 2014, endDate: 2015
:
PrimaryName SecondaryName Volume Year
A B 12 2014
C D 14 2014
A D 20 2014
A B 8 2015
C D 16 2015
A D 30 2015
...
我不允许修改myStoredProcedure
。因此,我在第二个SP中构建一个while
循环来接收它。我的代码就像:
declare @temp_table table
(
PrimaryGroup varchar(10),
SecondaryGroup varchar(10),
Volume int
)
while @startDate < @endDate
begin
insert into @temp_table
exec myStoredProcedure @startDate @endDate
set @startDate = DATEADD(YEAR,1,@startDate)
end
select * from @temp_table
这给了我没有year
列的结果。我需要一个year
列,就像我在上面的示例输出中所示。我找不到添加它的方法。 myStoredProcedure
返回的结果集中没有主键。此外,SQL Server 2008不允许我在year
中添加@temp_table
列,说明字段不匹配。如何正确添加year
列?任何帮助将不胜感激!
编辑:当我在@temp_table的定义中添加year
列时,收到错误:Column name or number of supplied values does not match table definition.
答案 0 :(得分:2)
您已经使用当前的语法关闭了,您只需要将year
添加到临时表并在调用存储过程后提供它。此外,您还需要指定要插入的列(这是一种值得习惯的习惯),因为您的过程不会返回相同数量的列。
declare @temp_table table
(
PrimaryGroup varchar(10),
SecondaryGroup varchar(10),
Volume int,
Year int
)
while @startDate < @endDate
begin
insert into @temp_table (PrimaryGroup, SecondaryGroup, Volume)
exec myStoredProcedure @startDate @endDate
Update @temp_table
Set Year = @StartDate
Where Year Is Null
set @startDate = DATEADD(YEAR,1,@startDate)
end
select * from @temp_table
答案 1 :(得分:2)
将年份列添加到临时表,并应用结构化插入
declare @temp_table table
(
PrimaryGroup varchar(10),
SecondaryGroup varchar(10),
Volume int,
Year int
)
while @startDate < @endDate
begin
insert into @temp_table (PrimaryName,SecondaryName,Volume)
exec myStoredProcedure @startDate @endDate
Update @temp_table set Year = @startDate where Year is Null
set @startDate = DATEADD(YEAR,1,@startDate)
end
select * from @temp
答案 2 :(得分:0)
创建一个将保存结果的第二个表变量:
declare @result_table table
(
Year int,
PrimaryGroup varchar(10),
SecondaryGroup varchar(10),
Volume int
)
然后在将结果提取到while
后的@temp_table
循环中:
insert into @result_table
select <year>, PrimaryGroup, SecondaryGroup, Volume from @temp_table;
truncate @temp_table;