Perché SQL Server non può alterare la vista in una stored procedure?
-
02-10-2019 - |
Domanda
sto usando MS SQL Server, e mi piacerebbe modificare una vista dall'interno di una stored procedure, eseguendo qualcosa come "vista alter VIEWNAME come ([alcuni sql])".
Qualche pagina sollevate da google affermano che questo non è supportato direttamente (e non sono correlati dichiarazioni alter-tavolo), ma ci sono anche esempi di come il lavoro intorno ad esso utilizzando le costruzioni in questo modo:
declare @sql varchar(max)
select @sql = 'alter view VIEWNAME as ([some sql])'
exec(@sql)
Codice Scrittura come stringhe letterali puzza un po ', anche per SQL.
Le mie domande:
- Perché questo non è supportato? Qual è la differenza tra l'esecuzione di questo da uno sProc e funzionante come una dichiarazione standalone?
- Perché la soluzione attraverso
exec
ing letterale lavoro stringa SQL? La mia comprensione della dichiarazioneexec
è che semplicemente esegue lo SQL in linea, è che non è corretto? - (non è ottimista) C'è un modo migliore per fare una modifica a una vista dall'interno di una procedura immagazzinata?
Soluzione
Credo che le risposte sono:
- MS vogliono impedire DDL in esecuzione all'interno di procedure.
- Il codice di nel la dichiarazione exec non è trattata come parte della procedura -. Quindi non è soggetto alle stesse restrizioni della procedura
- Nessun.
Un approccio alternativo potrebbe essere quello di avere una tabella separata (denominata qualcosa come swing_table) con 1 o 0 record per indicare se la vista deve interrogare la produzione o l'altra tabella rispettivamente - qualcosa di simile (backup?):
create view viewname as
select {field list}
from production_table
cross join swing_table
union all
select {field list}
from backup_table
where (select count(*) from swing_table) = 0
- swing_table quindi TRUNCATE nell'ambito della procedura quando si desidera, ehm, altalena tavolo -. In quanto TRUNCATE non è un comando transazionale, deve eseguire immediatamente