【问题标题】:Call a stored procedure from within an INSERT INTO从 INSERT INTO 中调用存储过程
【发布时间】:2011-01-20 15:20:29
【问题描述】:

所以我有这个存储过程,它接受一个 DATETIME 参数,日期。它将该值插入另一个表并返回该 ID。

让我们调用这个存储过程getTimeID。其中 DimTime 是它插入 DATETIME 参数的表。

所以我想复制到 TableB ID 和 TimeID,而不是 ID 和日期。

我正在尝试:

INSERT INTO  [TableA].dbo.Main (ID, timeID) 
SELECT  ID,
        (EXEC getTimeID date)
FROM      [TableB].dbo.Main

但我无法让 EXEC 上的语法正常工作。

请帮忙。

【问题讨论】:

  • 您是否想在一个语句中从 tableA 中选择所有行(id、日期),但为每一行调用一个 SP 转换日期(插入另一个表并获取 ID)并使用将 TimeID(每行)放入 tableB?

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


【解决方案1】:

从存储过程插入的语法是:

INSERT INTO TheTable (col1, col2) EXEC TheStoredProcedure

非常不灵活:表必须与存储过程的精确列布局匹配。

一种可能的解决方案是将存储过程的结果存储到表变量中。例如:

declare @id int
select  @id = ID 
from    [TableB].dbo.Main

declare @t table (TimeID int)
insert @t (TimeID) exec getTimeID '2011-01-20'

declare @TimeID int
select  @TimeID = TimeID 
from    @t

insert [TableA].dbo.Main values (@ID, @TimeID) 

【讨论】:

    【解决方案2】:

    如果您要嵌套存储过程调用或使用动态 SQL,那么您最终将使用临时表而不是表变量。您仍然需要提前定义表格,但您会像这样填充它:

    INSERT INTO #t EXEC sp_executesql @cmd

    Andomar 针对您的特定场景建议的其他流程会很好。

    如果你有能力,我会将该存储过程转换为一个函数,然后使用:

    INSERT INTO [TableA].dbo.Main (ID, timeID) 
    SELECT ID,
           dbo.getTimeID(date)
    FROM [TableB].dbo.Main
    

    【讨论】:

      猜你喜欢
      • 2020-06-07
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多