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:

  1. Perché questo non è supportato? Qual è la differenza tra l'esecuzione di questo da uno sProc e funzionante come una dichiarazione standalone?
  2. Perché la soluzione attraverso execing letterale lavoro stringa SQL? La mia comprensione della dichiarazione exec è che semplicemente esegue lo SQL in linea, è che non è corretto?
  3. (non è ottimista) C'è un modo migliore per fare una modifica a una vista dall'interno di una procedura immagazzinata?
È stato utile?

Soluzione

Credo che le risposte sono:

  1. MS vogliono impedire DDL in esecuzione all'interno di procedure.
  2. Il codice di nel la dichiarazione exec non è trattata come parte della procedura -. Quindi non è soggetto alle stesse restrizioni della procedura
  3. 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

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