it-swarm.com.de

SQL Server SELECT INTO @variable?

Ich habe den folgenden Code in einem meiner Sql (2008) Stored Procs, der einwandfrei ausgeführt wird:

    CREATE PROCEDURE [dbo].[Item_AddItem]
        @CustomerId uniqueidentifier,
        @Description nvarchar(100),
        @Type int,
        @Username nvarchar(100),
    AS
    BEGIN

        DECLARE @TopRelatedItemId uniqueidentifier;
        SET @TopRelatedItemId = 
        (
           SELECT top(1) RelatedItemId 
           FROM RelatedItems 
           WHERE CustomerId = @CustomerId
        ) 

        DECLARE @TempItem TABLE
        (
            ItemId uniqueidentifier,
            CustomerId uniqueidentifier,
            Description nvarchar(100),
            Type int,
            Username nvarchar(100),
            TimeStamp datetime
        );

        INSERT INTO Item
        OUTPUT INSERTED.* INTO @TempItem
        SELECT NEWID(), @CustomerId, @Description, @Type, @Username, GETDATE()

        SELECT
            ItemId,
            CustomerId,
            @TopRelatedItemId,
            Description,
            Type,
            Username,
            TimeStamp
        FROM
            @TempItem
END
GO

Die Frage für euch ist also, ob es eine Möglichkeit gibt, etwas in der Art von: zu tun

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

Damit ich diese Daten aus dem Speicher in anderen folgenden Anweisungen wiederverwenden kann? SQL Server passt zu der obigen Anweisung, ich möchte jedoch keine separaten Variablen erstellen und jede von ihnen über eine separate SELECT-Anweisung für dieselbe Tabelle initialisieren müssen .... UGH !!!

Irgendwelche Vorschläge, wie man etwas in die richtige Richtung bringt, ohne mehrere Abfragen an derselben Tabelle durchzuführen?

229
bleepzter

Sie können .. IN .. keine TABELLE VARIABEL AUSWÄHLEN. Das Beste, was Sie tun können, ist, es zuerst zu erstellen und dann einzufügen. Dein 2. Schnipsel muss sein

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT INTO 
    @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId
194
RichardTheKiwi

Wenn Sie einfach einige Variablen für die spätere Verwendung zuweisen möchten, können Sie sie in einer einzigen Aufnahme mit etwas in dieser Richtung ausführen:

declare @var1 int,@var2 int,@var3 int;

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition

Wenn Sie danach suchen

468
dougajmcdonald

du kannst das:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

dann später

SELECT CustomerId FROM #tempCustomer

sie müssen die Struktur von #tempCustomer nicht deklarieren

Es sieht so aus, als ob Ihre Syntax leicht verfälscht ist. Dies hat einige gute Beispiele

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

Dann später

SELECT CustomerId FROM @TempCustomer
14
Pat L

Klingt wie Sie temporäre Tabellen wollen. http://www.sqlteam.com/article/temporary-tables

Beachten Sie, dass #TempTable in Ihrem gesamten SP verfügbar ist.

Beachten Sie, dass die ## TempTable für alle verfügbar ist.

2
Valamas

Ihre Frage suchte nach einer Lösung für dasselbe Problem. und was andere Antworten nicht zeigen, ist eine Möglichkeit, mit einer Variablen den Namen der Tabelle für jede Ausführung Ihrer Prozedur in einer permanenten, nicht temporären Form zu ändern.

Bisher verkette ich den gesamten SQL-Code mit den zu verwendenden Variablen. So was:

declare @table_name as varchar(30)
select @table_name = CONVERT(varchar(30), getdate(), 112)
set @table_name = 'DAILY_SNAPSHOT_' + @table_name

EXEC('
        SELECT var1, var2, var3
        INTO '[email protected]_name+'
        FROM my_view
        WHERE string = ''Strings must use double apostrophe''
    ');

Ich hoffe, es hilft, aber es könnte umständlich sein, wenn der Code zu groß ist. Wenn Sie also einen besseren Weg gefunden haben, teilen Sie ihn bitte mit!

1
Rodrigo