2011-01-20 94 views
3

所以我有這個存儲過程需要DATETIME參數date。它將該值插入到另一個表中並返回該ID。從INSERT INTO調用存儲過程

讓我們調用這個存儲過程getTimeID。 DimTime是插入DATETIME參數的表。

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

我想:

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

但我不能得到EXEC工作的語法。

請幫忙。

+0

你想,在一個聲明中,選擇所有行(ID,日期)從tableA,但調用每個行的SP轉換日期(插入到另一個表和獲得ID),並使用TimeID(每行)到tableB? – RichardTheKiwi 2011-01-20 19:45:36

回答

6

從一個存儲過程中插入的語法是:

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) 
+0

工作。謝謝! – heero101086 2011-01-21 20:54:29

0

如果你打算要嵌套存儲過程調用或使用動態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