it-swarm-eu.dev

SQL Server SELECT INTO @variable?

V jednom z mých Sql (2008) Stored Procs mám následující kód, který funguje naprosto v pořádku:

    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

Takže otázka pro vás je, že existuje možnost udělat něco v souladu s:

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

Abych mohl tato data znovu použít z paměti v dalších následujících tvrzeních? SQL Server hodí fit s výše uvedené prohlášení, ale já nechci muset vytvářet samostatné proměnné a inicializovat každou z nich pomocí samostatného příkazu SELECT proti stejné tabulce .... UGH !!!

Nějaké návrhy, jak dosáhnout něčeho na řádcích bez více dotazů proti stejné tabulce?

222
bleepzter

Nemůžete VYBRAT .. DO DO TABULKY VARIANTY. To nejlepší, co můžete udělat, je vytvořit jej nejprve a poté do něj vložit. Váš druhý úryvek musí být

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
191
RichardTheKiwi

Pokud jste chtěli jednoduše přiřadit některé proměnné pro pozdější použití, můžete je udělat v jednom záběru s něčím v těchto řádcích:

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

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

Jestli je to ten typ věci, po které jsi

458
dougajmcdonald

můžeš to udělat:

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

pak později

SELECT CustomerId FROM #tempCustomer

nemusíte deklarovat strukturu #tempCustomer

Vypadá to, že vaše syntaxe je mírně mimo. To má několik dobré příklady

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

Pak později

SELECT CustomerId FROM @TempCustomer
14
Pat L

Zní to, jako byste chtěli dočasné tabulky. http://www.sqlteam.com/article/temporary-tables

#TempTable je k dispozici v celém SP.

Všimněte si, že ## TempTable je k dispozici všem.

2
Valamas

Našel jsem vaši otázku při hledání řešení stejného problému; a jiné odpovědi, které nedokážou poukázat, je způsob, jak pomocí proměnné změnit název tabulky pro každé provedení vaší procedury v trvalé formě, nikoli dočasné.

Zatím dělám zřetězení celého kódu SQL s použitými proměnnými. Takhle:

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''
    ');

Doufám, že to pomůže, ale mohlo by to být těžkopádné, pokud je kód příliš velký, takže pokud jste našli lepší způsob, prosím, sdílejte!

1
Rodrigo