2013-04-22 65 views
2

我正在寫一個存儲過程,首先在表中插入一個新行。這個查詢生成的ID然後需要另一個查詢。是否可以使用OUTPUT訪問預先生成的ID?INSERT INTO的輸出存儲過程

這是我迄今所做的,它是一個很值得猜測,沒有工作

ALTER PROCEDURE [dbo].[addApp] 

     @Name varchar(50) 
    , @logoUrl varchar(150) 
    , @siteUrl varchar(150) 
    , @userId int 
    , @canvasWidth int 
    , @canvasHeight int 

AS 
DECLARE @tempId INT 
SET @tempid = INSERT INTO AppInfo (name, logoUrl, userId) 
       OUTPUT inserted.id 
       VALUES(@Name, @logoUrl, @userId); 
INSERT INTO CanvasApps (id, siteUrl, canvasWidth, canvasHeight) 
OUTPUT inserted.id 
VALUES(@tempid, @siteUrl, @logoUrl, @userId); 
+1

爲什麼你會猜測什麼時候有文檔和數百個例子? – 2013-04-22 13:01:00

+1

對不起,但我沒有找到任何關於如何在這種情況下使用OUTPUT的好例子。現在我得到了一個完美的答案,希望也能幫助別人。和平 – Abris 2013-04-22 19:11:41

回答

5

你甚至可以做到在單一聲明:

ALTER PROCEDURE [dbo].[addApp] 

     @Name VARCHAR(50) 
    , @logoUrl VARCHAR(150) 
    , @siteUrl VARCHAR(150) 
    , @userId INT 
    , @canvasWidth INT 
    , @canvasHeight INT 

AS BEGIN 

    INSERT INTO dbo.AppInfo (name, logoUrl, userId) 
    OUTPUT Inserted.ID, @siteUrl, @canvasWidth , @canvasHeight 
     INTO dbo.CanvasApps (id, siteUrl, canvasWidth, canvasHeight) 
    VALUES (@Name, @logoUrl, @userId) 

END 
0

只需使用以下變量:

@@IDENTITY 
+4

您應該使用['@@ scope_Identity'](http://msdn.microsoft.com/en-gb/library/ms190315.aspx)由於這僅限於當前作用域,其中「@@ Identity」不是。 – codingbadger 2013-04-22 12:32:42

+1

我不認爲我曾經見過一個地方,其中@@ IDENTITY是解決方案,除了爲散列創建salt之外。據稱「Scope_Identity()」被修復,「OUTPUT」通常更有用。 – HABO 2013-04-22 13:00:09

1

你需要把的output結果轉換成表格而不僅僅是一個標量變量:

declare @tempId table (
    id int 
) 

INSERT INTO AppInfo (name, logoUrl, userId) 
     OUTPUT inserted.id into @tempId 
       VALUES(@Name, @logoUrl, @userId); 
+0

好奇的是,你說'OUTPUT'不能進入變量後創建一個表來表明_is_變量。 – HABO 2013-04-22 12:57:24

+0

標量變量和表變量之間存在差異。 – muhmud 2013-04-22 12:59:13

+0

同意。你的答案的第一行應該清楚。 – HABO 2013-04-22 13:03:59

3

試試這個 -

ALTER PROCEDURE [dbo].[addApp] 

     @Name VARCHAR(50) 
    , @logoUrl VARCHAR(150) 
    , @siteUrl VARCHAR(150) 
    , @userId INT 
    , @canvasWidth INT 
    , @canvasHeight INT 

AS BEGIN 

    DECLARE @tempId INT 

    INSERT INTO dbo.AppInfo (name, logoUrl, userId) 
    SELECT @Name, @logoUrl, @userId 

    SELECT @tempId = SCOPE_IDENTITY() 

    INSERT INTO dbo.CanvasApps (id, siteUrl, canvasWidth, canvasHeight) 
    SELECT @tempId, @siteUrl, @logoUrl, @userId 

END 
2

剛剛嘗試這一點您插入語句後使用此varible成二次插入statement.:-

SET @BVar=SCOPE_IDENTITY() 
0
ALTER PROCEDURE [dbo].[addApp] 
    @Name varchar(50), 
    @logoUrl varchar(150), 
    @siteUrl varchar(150), 
    @userId int, 
    @canvasWidth int, 
    @canvasHeight int 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT dbo.AppInfo (name, logoUrl, userId) 
    OUTPUT inserted.id, @siteUrl, @canvasWidth, @canvasHeight 
     INTO dbo.CanvasApps(id, siteUrl, canvasWidth, canvasHeight) 
    SELECT @Name, @logonUrl, @userId; 
END 
GO