【问题标题】:SQL Server 2014 execute stored procedure multiple times and Insert into table including parameterSQL Server 2014 多次执行存储过程并插入包含参数的表中
【发布时间】:2018-02-21 05:42:17
【问题描述】:

我有一个存储过程,它获取两个参数,DateEquipName 并且结果集没有存储在表中。

我想要做的是为不同的EquipName 和每个结果集多次运行存储过程,INSERT 只运行到一个表中 (MyTable)。

存储过程的结果有30行。

为此,我使用以下代码。

感谢this Link

DECLARE @EquipName INT

DECLARE curs CURSOR LOCAL FAST_FORWARD FOR
    SELECT EquipName 
    FROM EquipTable 
    WHERE ...

OPEN curs

FETCH NEXT FROM curs INTO @EquipName

WHILE @@FETCH_STATUS = 0 
BEGIN
    INSERT INTO MyTable
        EXEC sp_storeProc  '2018-01-01', @EquipName

    FETCH NEXT FROM curs INTO @EquipName
END

CLOSE curs
DEALLOCATE curs

我的问题是:

假设存储过程结果有 5 列,但 MyTable一个额外的列 NameOfEquip,对于存储过程的每个结果集,将 @EquipName 插入所有 30该结果集的行。

我该怎么做? MyTable 已使用正确的架构创建。

【问题讨论】:

    标签: sql-server stored-procedures dynamic-sql insert-into


    【解决方案1】:

    在每次插入表后,尝试更新 NameOfEquip 以获取所有为 NULL 的值。也许是这样的

    WHILE @@FETCH_STATUS = 0 
    BEGIN
        INSERT INTO MyTable
            EXEC sp_storeProc  '2018-01-01', @EquipName
    
    UPDATE MyTable SET NameOfEquip = ISNULL(@EquipName,'') WHERE NameOfEquip IS NULL
    
    
        FETCH NEXT FROM curs INTO @EquipName
    END
    

    【讨论】:

    • 谢谢jayasura 这工作完美,我也注意到更新行,这也有效。 UPDATE MyTable SET NameOfEquip = @EquipName WHERE NameOfEquip IS NULL 它给出了相同的结果
    • 我添加了 ISNULL,因为如果 @EquipName 的值为 NULL,那么它可能会使用 Next NOT NULL 值进行更新。为了更安全
    【解决方案2】:

    您可以将存储过程的结果插入到临时表中,然后从临时表中读取带有额外列的内容并插入到“MyTable”中。 像这样的:

    DECLARE @TempTable TABLE (ColA INT, ColB INT)
    
    INSERT INTO @TempTable
    EXEC sp_storeProc  '2018-01-01', @EquipName
    
    INSERT INTO MyTable
    SELECT *, @EquipName FROM @TempTable
    

    【讨论】:

      【解决方案3】:

      您也可以使用OPENROWSET 实现此目的。您可以在此here 上找到更多详细信息

      以下是相同的示例。

      例如,您有一个如下所示的 SP。

      CREATE PROCEDURE TEST
      (
       @INPUT1 VARCHAR(10),
       @INPUT2 VARCHAR(20)
      )
      AS
      BEGIN
      SELECT @INPUT1 AS COL1, @INPUT2 AS COL2
      END
      

      如果直接执行SP

      EXECUTE TEST 'A','B'
      

      你会得到如下输出。

          COL1    COL2
         ------  ------
          A        B
      

      要在结果中附加一个额外的参数,您可以尝试如下。

      DECLARE @TBL TABLE(COL1 VARCHAR(10), COL2 VARCHAR(10), COL3 DATETIME)
      
      INSERT INTO @TBL(COL1,COL2,COL3)
      SELECT A.*,GETDATE() 
      from openrowset('SQLNCLI','Server=(local);Trusted_Connection=yes;',
         'EXECUTE TEST ''A'',''B''') AS A
      
       SELECT * FROM @TBL
      

      输出:

      COL1    COL2    COL3
      A        B      2018-02-21 09:09:03.257
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多