【问题标题】:SQL Server 2012: Insert into temp table static values, results of Stored Procedures and calculated valueSQL Server 2012:插入临时表静态值、存储过程的结果和计算值
【发布时间】:2019-01-06 17:20:10
【问题描述】:

我有多个 stored procedures 返回一个值。我想创建另一个stored procedure,它将运行所有现有的SPs,并将返回的值存储在temp table中:

CREATE TABLE #temptbl(metricid int, value float, normalizedvalue int) 

metricid 将是静态的,例如 SP_CalcMetric1 将是 1 等。

value 将是每个SP 的返回结果

normalizedvalue 将是每个SP 的返回结果的归一化值,例如SP_CalcMetric1 将被归一化

if (value < 5)
     normalizedvalue = 100;
else if (value >= 5 && value < 10)
     normalizedvalue = 50;
else
     normalizedvalue = 0;

每个SP 结果都有不同的归一化方法。

问题是我如何编写insert statement 来组合静态int、存储过程的值和规范化值(从规范化方法计算)

【问题讨论】:

  • 不清楚你遇到了什么问题。捕获每个 SP 的返回值? (EXEC @retval = SP_CalcMetric1 ...) 编写INSERT 语句?将您的伪代码翻译成 T-SQL?为可变数量的程序执行此操作?
  • 您的问题到底是什么?你似乎没有问过。
  • 请检查已编辑的问题
  • 你有多少个像SP_CalcMetric1这样的存储过程?
  • 你有没有可能只拥有CalcMetric,采用@metricid 参数?这至少会使您的外部逻辑更加健壮,否则您将需要动态 SQL。 (但如果这些过程中的每一个都有完全不同的逻辑,那么它并没有太大帮助,因为它只是将复杂性转移到必须为CASEIF 的存储过程。)(另外,don't use the sp_ prefix for user stored procedures,它是保留对性能不利。)

标签: sql-server stored-procedures sql-server-2012 temp-tables


【解决方案1】:

您可以使用 OPENQUERY 来操作 sp 调用返回的值,并将每个 sp 的结果分别插入到同一个表中,例如...

CREATE TABLE #temptbl(metricid int, value float, normalizedvalue int);

INSERT INTO #temptbl(metricid , value  , normalizedvalue )
SELECT  1 
      , value
      ,  CASE 
            WHEN value < 5 
                THEN 100
            WHEN value >= 5 AND value < 10
                THEN 50
            ELSE 0
        END
FROM OPENQUERY(YOURSERVERNAME, 'EXEC SP_CalcMetric1')

UNION ALL 

SELECT  2 
      , value
      ,  CASE    --<-- Some other logic here as you mentioned it could be different
            WHEN value < 5     
                THEN 100
            WHEN value >= 5 AND value < 10
                THEN 50
            ELSE 0
        END
FROM OPENQUERY(YOURSERVERNAME, 'EXEC SP_CalcMetric2')
.
.
. add more union all if you need to. 

【讨论】:

    【解决方案2】:

    我会更改每个CalcMetric 过程以返回三个值:

    MetricID
    Value
    NormalizedValue  (this can be encapsulated in a scalar-value function)
    

    (并将其重命名为 cmets 中建议的 Jeroen Mostert)

    然后你只需将存储过程的结果插入#TempTBL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-20
      • 2014-11-21
      • 2020-01-26
      • 2018-07-05
      • 2015-03-05
      • 2014-08-28
      • 1970-01-01
      相关资源
      最近更新 更多