2011-01-28 25 views
183

ho il seguente codice in uno dei miei Sql (2008) stored procedure che esegue perfettamente bene:SQL Server SELECT INTO @variable?

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 è c'è 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 da poter 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 lungo le linee senza più query sulla stessa tabella?

+1

"per creare variabili separate e inizializzarle ognuna tramite un'istruzione SELECT separata" - perché dovresti farlo? 'declare @t table' una volta, e se è necessario riutilizzarlo, lanciare un' DELETE @ TempCustomer' prima di inserirlo nuovamente in esso – RichardTheKiwi

risposta

165

Non è possibile selezionare .. INTO .. ​​VARIABILE DI TABELLA. Il meglio che puoi fare è crearlo per primo, quindi inserirlo dentro. Il secondo snippet 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 
+4

Si noti che questo funziona bene anche in un contesto CTE. Bazinga! –

+2

Chiunque ha una risposta a * perché * non è possibile selezionare una variabile di tabella come è possibile con una tabella temporanea effettiva? – KSwift87

13

Sembra che la sintassi sia leggermente fuori. Questo ha qualche good examples

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 
2

Sembra che si desidera tabelle temporanee. http://www.sqlteam.com/article/temporary-tables

Nota che #TempTable è disponibile in tutto il tuo SP.

Nota il ## TempTable è disponibile per tutti.

+2

## temptable - finché il proprietario (creatore) non lo elimina o viene disconnesso – RichardTheKiwi

+3

Non desidero tabelle temporanee. Le tabelle temporanee sono costose e lente. Voglio solo mantenere un po 'di dati per un record specifico per una piccola quantità di tempo e renderlo disponibile a più istruzioni SQL, senza successive ricerche. Poiché le variabili di tabella hanno un ambito all'interno del processo memorizzato in cui sono state definite, rappresentano la soluzione perfetta per l'archiviazione dei dati erogati per quella chiamata di processo memorizzata ... – bleepzter

+3

Ho anche dimenticato di menzionare che il database risiede in Azure .... Non voglio introdurre problemi nella gestione delle tabelle temporanee. – bleepzter

21

si può fare questo:

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

poi

SELECT CustomerId FROM #tempCustomer 

voi non ha bisogno di dichiarare la struttura di #tempCustomer

+3

@webturner Nessuno di questi punti è vero. Le tabelle temporali non sono comprese all'esterno del proc e le variabili di tabella non sono più "solo memoria" delle tabelle temporali. –

+0

@MartinSmith Sono corretto, commento rimosso. –

+3

Non dimenticare di aggiungere un 'DROP TABLE # tempCustomer' quando' # tempCustomer' non è più necessario altrimenti la prossima selezione causerà l'errore '#tempCustomer già esistente' – ViRuSTriNiTy

384

Se si voleva assegnare semplicemente alcune variabili per uso successivo, puoi eseguirli 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 stai dopo

+1

La risposta migliore è imho, ma cosa succede se i risultati sono più di uno? – capitano666

+0

Se i risultati sono più di uno, si otterrà uno dei valori disponibili. Questo potrebbe rendere interessante un puzzle! Vedere https://www.mssqltips.com/sqlservertip/1888/when-to-use-set-vs-select-when-assigning-values-to-variables-in-sql-server – Smandoli

+5

Per forzare la query a restituire un uso singola riga SELEZIONA TOP 1 – Adrian

-1
"SELECT * 
    INTO 
    @TempCustomer 
FROM 
    Customer 
WHERE 
    CustomerId = @CustomerId" 

che significa creare un nuovo @tempCustomer tablevariable e l'inserimento dei dati da clienti. L'avevi già dichiarato in precedenza, quindi non c'è bisogno di dichiarare di nuovo. Meglio andare con

INSERT INTO @tempCustomer SELECT * FROM Customer 
+1

Non funziona. È ancora necessario dichiarare la variabile di tabella in anticipo. –

Problemi correlati