Domanda

Perché non puoi farlo e c'è una soluzione?

Ottieni questo errore.

MSG 2714, Livello 16, Stato 1, riga 13 Esiste già un oggetto chiamato "#Tempable" nel database.

declare @x int

set @x = 1

if (@x = 0)
begin
    select 1 as Value into #temptable
end
else
begin
   select 2 as Value into #temptable
end

select * from #temptable

drop table #temptable
È stato utile?

Soluzione

Questa è una domanda divisa in due parti e sebbene Kev Fairchild fornisca una buona risposta alla seconda domanda, ignora totalmente la prima: perché viene prodotto l'errore?

La risposta sta nel modo in cui funziona il preprocessore.Questo

SELECT field-list INTO #symbol ...

viene risolto in un albero di analisi direttamente equivalente a

DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...

e questo inserisce #symbol nella tabella dei nomi dell'ambito locale.Lo scopo di _sessionid è fornire a ciascuna sessione utente uno spazio dei nomi privato;se si specificano due hash (##simbolo) questo comportamento viene soppresso.L'eliminazione e l'eliminazione dell'estensione sessionid è (ovviamente) trasparente.

Il risultato di tutto ciò è che più clausole INTO #symbol producono più dichiarazioni nello stesso ambito, portando al messaggio 2714.

Altri suggerimenti

Non puoi farlo a causa della risoluzione dei nomi posticipata, puoi farlo con una tabella reale, basta eliminare i simboli cancelletto

Potresti anche creare prima la tabella temporanea in alto e poi inserire regolarmente nella tabella

Primo passo...controlla se la tabella esiste già...se lo fa, cancellalo.Successivamente, crea esplicitamente la tabella anziché utilizzare SELECT INTO...

Lo troverai molto più affidabile in questo modo.

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN
DROP TABLE #temptable
END

CREATE TABLE #temptable (Value INT)

declare @x int

set @x = 1

if (@x = 0)
begin
    INSERT INTO #temptable (Value) select 1
end
else
begin
    INSERT INTO #temptable (Value) select 2
end

select * from #temptable

drop table #temptable

Inoltre, si spera che i nomi della tabella e dei campi siano semplificati per il tuo esempio e non siano quello che tu Veramente chiamali ;)

--Kevin Fairchild

La risoluzione dei nomi differita è anche il motivo per cui non puoi essere sicuro che sp_depends restituisca risultati corretti, dai un'occhiata a questo post che ho scritto qualche tempo fa Dipendi da sp_depends (nessun gioco di parole)

Immagino che il problema sia che non hai creato il file #temptable.

Mi dispiace, non posso essere più dettagliato, ma dal momento che non hai nemmeno provato a spiegare ciò che vedi, ottieni una risposta tutt'altro che stellare.

Dall'aspetto del codice sembra che potresti averlo prototipato in SQL Studio o qualcosa di simile, giusto?Posso immaginare che tu l'abbia eseguito alcune volte e sia arrivato al punto in cui è stato creato #temptable ma poi ha fallito prima di arrivare alla fine e ha lasciato cadere di nuovo la tabella?Riavvia lo strumento di modifica SQL che stai utilizzando e riprova.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top