如何在不修改SP的情况下向SP返回的结果集中添加其他列?

时间:2016-12-07 14:24:28

标签: sql sql-server sql-server-2008 stored-procedures

我有一个名为myStoredProcedure的存储过程(SP),根据startDateendDate用户定义的参数向我返回这样的输出:

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.

3 个答案:

答案 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;