risposta-alla-domanda-sullo-sviluppo-web-bd.com

SQL Server SELECT INTO @variable?

Ho il seguente codice in uno dei miei Sql (2008) Stored Procs che funziona perfettamente bene:

    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

Quindi la domanda per voi ragazzi è la possibilità di fare qualcosa sulla falsariga di:

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

In modo che potessi riutilizzare questi dati dalla memoria in altre dichiarazioni successive? SQL Server si adatta all'istruzione precedente, tuttavia non desidero creare variabili separate e inizializzarle ognuna tramite un'istruzione SELECT separata rispetto alla stessa tabella .... UGH !!!

Qualche suggerimento su come ottenere qualcosa in linea senza più query sullo stesso tavolo?

218
bleepzter

Non puoi SELEZIONARE .. INTO .. ​​una VARIABILE DI TABELLA. Il meglio che puoi fare è crearlo per primo, quindi inserirlo in esso. Il tuo secondo frammento deve essere

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

Se si desidera semplicemente assegnare alcune variabili per un uso futuro, è possibile eseguirle in un'unica operazione con qualcosa del genere:

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

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

Se questo è il tipo di cosa che cerchi

454
dougajmcdonald

puoi farlo:

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

poi più tardi

SELECT CustomerId FROM #tempCustomer

non è necessario dichiarare la struttura di #tempCustomer

Sembra che la tua sintassi sia leggermente fuori. Questo ha alcuni buoni esempi

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

Poi più tardi

SELECT CustomerId FROM @TempCustomer
14
Pat L

Sembra che tu voglia tavoli temporanei. http://www.sqlteam.com/article/temporary-tables

Tieni presente che #TempTable è disponibile in tutto il tuo SP.

Nota: ## TempTable è disponibile per tutti.

2
Valamas

Ho trovato la tua domanda alla ricerca di una soluzione allo stesso problema; e quali altre risposte non riescono a puntare è un modo per utilizzare una variabile per cambiare il nome della tabella per ogni esecuzione della procedura in una forma permanente, non temporanea.

Finora quello che faccio è concatenare l'intero codice SQL con le variabili da usare. Come questo:

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

Spero che sia d'aiuto, ma potrebbe essere ingombrante se il codice è troppo grande, quindi se hai trovato un modo migliore, per favore condividi!

0
Rodrigo