Fügen Sie Ergebnisse einer gespeicherten Prozedur in eine Tabellenvariable ein

11

Ich habe eine gespeicherte Prozedur, die Werte in einer Tabellenvariablen speichert. Ich wähle diese Werte aus und gebe sie zurück, wenn die Prozedur aufgerufen wird.

Ich versuche, diese Rückgabewerte in einer anderen Tabellenvariablen festzulegen, kann es aber nicht herausfinden.

Gespeicherte Prozedur

ALTER PROCEDURE [dbo].[GetOrSetDomainId]
@DomainName varchar(50),
@DomainUrl varchar(50)
AS
BEGIN
    DECLARE @DomainId bigint;
    DECLARE @NumberOfRwos bigint;

    DECLARE @DomainHistory TABLE
    (
        DomainId bigint, 
        HasHistory bit,
        ServerOnline bit,
        DatabaseOnline bit, 
        ServerPerformance bigint,
        DatabasePerformance bigint, 
        SoldTickets bigint
    )


    SELECT  @NumberOfRwos =  COUNT(Id) 
    FROM DomainData
    WHERE DomainName = @DomainName OR DomainUrl = @DomainUrl

    IF(@NumberOfRwos = 0)
    BEGIN
        INSERT INTO DomainData (DomainName, DomainUrl) VALUES (@DomainName, @DomainUrl)

         SELECT @DomainId =  @@IDENTITY

         INSERT INTO @DomainHistory(DomainId,HasHistory)VALUES(@DomainId, 0)

         SELECT * FROM @DomainHistory
    END

    ELSE
    BEGIN
    ---not important here----
    END

END

Code anrufen

Ich rufe die Prozedur auf mit:

DECLARE @DomainHistory TABLE
(
    DomainId bigint, 
    HasHistory bit,
    ServerOnline bit,
    DatabaseOnline bit, 
    ServerPerformance bigint,
    DatabasePerformance bigint, 
    SoldTickets bigint
)

SET @DomainHistory = EXEC GetOrSetDomainId 'test', 'test2'
---Other alternatives:---
INSERT INTO @DomainHistory(DomainId,HasHistory)
VALUES(EXEC GetOrSetDomainId 'test', 'test2')

Wie kann ich das machen?

ThunD3eR
quelle
@@IDENTITYKann übrigens unerwartete Werte ergeben, wenn Trigger beteiligt sind. SCOPE_IDENTITY()ist in der Regel am besten. Mehr
Jon of All Trades

Antworten:

13

Um die Ergebnisse in eine Tabelle einzufügen, möchten Sie nur INSERT....EXEC...nicht den VALUESTeil der Abfrage.

In Ihrem Fall würde dies folgendermaßen aussehen:

INSERT INTO @DomainHistory(DomainId,HasHistory)
EXEC GetOrSetDomainId 'test', 'test2';
Mark Sinkinson
quelle