【问题标题】:Count # of Rows in Stored Procedure Result, then Insert result into table计算存储过程结果中的行数,然后将结果插入表中
【发布时间】:2015-11-05 13:49:04
【问题描述】:

我有一个 SSIS 包,它将首先运行我的 sp_doSomething。这个存储过程将从几个不同的表中选择数据并将它们连接起来,以便可能存储到 dbo.someTable 中。但我只希望如果选择是 > 1 行选定数据。

然后我想有一个优先约束来查看我的存储过程返回的行数。

如果我的行数 > 1,那么我想获取存储过程的结果并将它们插入到我的一张表中。

否则,我将记录错误/发送电子邮件或其他任何内容。

我真的不想多次运行这个存储过程,但这是我能想到的唯一方法(运行它,计算行数。然后,再次运行它并插入结果)。

我是一个完整的 TSQL/SSIS 新手。所以如果这个问题是微不足道的,我很抱歉。 我在任何地方都找不到好的答案。

【问题讨论】:

  • 你能合并任务吗?我的意思是你可以简单地将逻辑添加到存储过程中吗?
  • 包中的 sp_doSomething 在做什么?它是否返回行数?创建结果集?如果它创建了一个结果集,您将如何处理包中的该结果集?
  • 如果可能的话,是的,我可以更改存储过程。但我不完全知道要使用什么命令来做到这一点。
  • @TabAlleman 抱歉,我更新了我的问题以添加该信息。存储过程使用 SELECT 从几个表中选择某些列和 JOINS 来创建一组我可能想要插入到 dbo.someTable 中的数据。
  • 第一个 sql 任务中的那组数据在做什么?将其存储在对象类型变量中?

标签: sql-server tsql stored-procedures ssis


【解决方案1】:

使用 Int32 类型的包范围和名称 rowcount 创建一个变量。

数据流

控制流程

【讨论】:

  • 非常棒的解决方案!谢谢,这工作得很好。
【解决方案2】:

你可以试试这个

declare @tableVar table(col1 varchar(100))
declare @Counter int
insert into @tableVar(col1)  exec CompanyNames

set @Counter = (select count(*) from @tableVar)
insert into Anytable(col) Values (@counter)

【讨论】:

    【解决方案3】:

    在存储过程中,将结果写入#Temp。然后从#Temp中选择Count(*),放入一个变量中。

    Select @intRows = Count(*) from myTempResults
    

    然后评估@intRows 的值。

    If @intRows > 1 BEGIN
    
    Insert Into dbo.SomeTable 
    Select * from #Temp 
    
    End
    

    【讨论】:

      【解决方案4】:

      #temp 表对您有用吗?

      IF OBJECT_ID('tempdb..#Holder') IS NOT NULL
      begin
          drop table #Holder
      end
      
      
      CREATE TABLE #Holder
      (ID INT )
      
      
      
      
      declare @MyRowCount int
      declare @MyTotalCount int = 0
      
      /* simulate your insert, you would read from your real table(s) here */
      INSERT INTO #HOLDER (ID) 
      select 1 union all select 2 union all select 3 union all select 4
      
      Select @MyRowCount = @@ROWCOUNT, @MyTotalCount = @MyTotalCount + @MyRowCount
      Select 'TheMagicValue1' = @MyRowCount, 'TheMagicTotal' = @MyTotalCount
      
      INSERT INTO #HOLDER (ID) 
      select 5 union all select 6 union all select 7 union all select 8
      
      /* you will note that I am NOT doing a count(*) here... which is another strain on the procedure */    
      
      Select @MyRowCount = @@ROWCOUNT, @MyTotalCount = @MyTotalCount + @MyRowCount
      Select 'TheMagicValue1' = @MyRowCount, 'TheMagicTotal' = @MyTotalCount
      
      /* Optional index if needed */
      CREATE INDEX IDX_TempHolder_ID ON #Holder (ID)
      /* CREATE CLUSTERED INDEX IDX_TempHolder_ID ON #Holder (ID) */    
      
      
      if @MyTotalCount > 0
      BEGIN
          Select 'Put your INSERT statement here'
      END
      
      
      /* this will return the data to the report */
      Select ID from #HOLDER
      
      
      IF OBJECT_ID('tempdb..#Holder') IS NOT NULL
      begin
          drop table #Holder
      end
      

      【讨论】:

        猜你喜欢
        • 2013-09-27
        • 1970-01-01
        • 2020-01-26
        • 2018-07-05
        • 2013-10-19
        • 2018-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多