【问题标题】:Replace procedural approach with a set based approach用基于集合的方法替换程序方法
【发布时间】:2014-07-10 13:43:02
【问题描述】:

我有一个存储过程,它从 SSIS 包中多次调用,并使用不同的值作为参数。该存储过程包含对 SSRS 多维数据集的打开查询,并返回人员列表。结果集存储在一个临时表中。

CREATE TABLE #tmp (Person varchar(50), Cat1 bit, Cat2 bit, Cat3 bit, Cat4 bit, Cat5 bit)
INSERT INTO #tmp EXEC sys.sp_executesql @query

SET @sqlCommand = 'SELECT Person FROM #tmp WHERE ' + @Category + '= 1'
EXEC (@sqlCommand);

对于结果集中的每个人,都应该插入到另一个包含一些信息的表中。这些信息是人名、其他一些静态内容,以及我可以通过运行另一个存储过程并计算返回的行数得到的值。

插入的示例可以是

     Name        Static info      @@rowcount   
+-------------++--------------++--------------+
|Homer Simpson||Something here||ValueFromCount|
+-------------++--------------++--------------+

到目前为止,我有一个预先编写的存储过程,可以将一行插入到所需的表中,但它有一个参数是人名。我通过从当前 SP 执行另一个 SP 来获得 @@rowcount 值(有点嵌套但工作正常)。

我可以轻松地为结果集中的每个人使用 SQL WHILE 循环或 CURSOR,并调用插入 SP,但我不禁想到必须有更有效的方法来执行此操作!

现在的流程是

  1. SSIS 包执行返回人员列表的存储过程
  2. 对于列表中的每个人,执行SP_Insert_To_Table procedure

    2.1。从SP_Insert_To_Table procedure,执行SP_Get_All_Actions,选择@@rowcount作为要插入的动态值。

我的想法是,我可以将#tmp 表中的结果与此人所做的操作计数结合起来,这样我就可以得到一个可以全部插入的新结果集,但是我无法弄清楚,因为计数是针对列表中的每个人的。

有没有办法以基于集合的方式而不是使用程序方法来解决这个问题?

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

    没有细节可以处理这有点具有挑战性,但听起来确实删除循环应该非常简单。我能做的只是粗略的伪代码。

    Insert into SomeTable (ColumnsListedHere)
    from SomeOtherTable
    join Something on some conditions
    where SomeCriteria = GetListOfPerson
    

    【讨论】:

    • 是的,我显然想多了。我的一些想法,我正在接近解决方案!
    猜你喜欢
    • 2012-08-24
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-08
    • 2012-06-10
    • 1970-01-01
    • 2012-11-10
    相关资源
    最近更新 更多