Domanda

Sto scrivendo una procedura memorizzata per SQL Server 2008 in cui ho bisogno di estrarre le informazioni da una serie di tabelle. Non so in anticipo la struttura di quei tavoli. C'è un altro tavolo nello stesso database che mi dice i nomi e i tipi dei campi in questa tabella.

Lo sto facendo:

declare @sql nvarchar(max)

set @sql = 'select ... into #new_temporary_table ...'
exec sp_executesql @sql

Then I iterate doing:

set @sql = 'insert into #another_temporary_table ... select ... from #new_temporary_table'
exec sp_executesql @sql
.

Dopo di che cadano la tabella temporanea. Ciò accade in un ciclo, quindi il tavolo con essere creato, popolato e rilasciato molte volte, ogni volta con diverse colonne.

Questo fallisce con l'errore:

.

Nome oggetto non valido: #new_tem30_table.

Dopo alcuni googling ho trovato che:

    .
  1. La tabella #new_temporary_table viene creata nell'ambito della chiamata a exec sp_executesql che è diversa da quella del mio Procen memorizzato. Questo è il motivo per cui il prossimo exec sp_executesql non riesce a trovare la tabella. Questo post lo spiega: http://social.msdn .microsoft.com / Forum / IT-US / TransactsQL / Thread / 1DD6A408-4AC5-4193-9284-4Fee8880D18A

  2. Potrei usare tabelle temporanee globali, che sono di valore con ##. Non posso farlo perché più Procs memorizzati potrebbero correre contemporaneamente e influenzerebbero lo stato dell'altro

  3. In questo articolo dice che se mi trovo in questa situazione dovrei cambiare la struttura del database. Questa non è un'opzione per me: http://www.somaskog.se/dynamic_sql.html

    Una soluzione alternativa che ho trovato stava combinando tutto il select into #new_temporary_table.. e tutti gli script insert into ... in un'unica dichiarazione gigantesca. Questo funziona bene ma ha degli aspetti negativi.

    Se lo stampa @SQL per risolvere i problemi, il testo viene troncato, ad esempio.

    Ho qualche altra opzione? Tutte le idee sono i benvenuti.

È stato utile?

Soluzione

Penso che sia meglio usare un singolo script.

È possibile modificare il numero di caratteri stampi in strumenti> Opzioni> Risultati della query> SQL Server> Risultati su testo - Modifica "Numero massimo di caratteri ..." da 256 al massimo (8192).

Se è più grande di 8192, quindi sì, la stampa è difficile. Ma potresti provare un'opzione diversa in questo caso. Invece di PRINT @sql; invece utilizzare il seguente (con i risultati in griglia):

SELECT sql FROM (SELECT @sql) AS x(sql) FOR XML PATH;
.

Ora puoi fare clic sul risultato e si apre in una nuova finestra di query. Bene, è una finestra di file XML e non puoi eseguirlo o vedere la codifica dei colori e devi ignorare che cambia ad es. > to > per renderlo valido come dati XML, ma da qui è facile da buliare se stai solo cercando di bullball. È possibile copiarlo e incollarlo in una finestra di editor di query reali e eseguire una ricerca e sostituirla per i caratteri divisati se ti piace. FWIW Ho chiesto loro di creare tali finestre di query Real Windows XML, ma questo è stato negato:

http://connect.microsoft.com/sqlserver/feedback/details/425990/ssms-wallow-same-semantics-for-xml-docs-as-query-windows

Altri suggerimenti

È possibile utilizzare le tabelle Global Temp , ma utilizzare un ID di contesto ( come NEWRID () ) come parte della tabella Global TEMPNome.

declare @sql varchar(2000)
declare @contextid varchar(50) = convert(varchar(20), convert(bigint, substring(convert(binary(16), newid()), 1, 4)))
set @sql = 'select getdate() as stuff into ##new_temporary_table_' + @contextid
exec (@sql)
.

# Le tabelle (non globali) sono disponibili nell'invisito che sono state create e sotto. Quindi potresti fare qualcosa come ...

while (your_condition = 1) begin
    set @sql = 'select ... into #temp1 ...from blah
        exec sp_do_the_inserts'
    exec(@sql)
end
.

lo sp_do_the_inserts potrebbe sembrare ...

select * into #temp2 from #temp1
....your special logic here....
.

Questo presuppone che tu crei sp_do_the_insert in anticipo, ovviamente. Non so se questo serve il tuo bisogno.

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