2010-09-15 52 views
4

J'utilise MS SQL Server, et je voudrais modifier une vue depuis une procédure stockée, en exécutant quelque chose comme "alter view VIEWNAME as ([some sql])".Pourquoi SQL Server ne peut-il pas modifier une vue dans une procédure stockée?

Quelques pages lancées par Google affirment que cela ne soit pas directement pris en charge (et ne sont liés alter table de déclarations), mais il y a aussi des exemples de la façon de travailler autour d'elle en utilisant des constructions comme ceci:

declare @sql varchar(max) 
select @sql = 'alter view VIEWNAME as ([some sql])' 
exec(@sql) 

L'écriture de code sous forme de chaînes littérales sent un peu, même pour SQL.

Mes questions:

  1. Pourquoi est-ce pas pris en charge? Quelle est la différence entre l'exécution d'un sproc et son exécution en tant que déclaration autonome?
  2. Pourquoi la solution de contournement passe-t-elle par exec lorsque la chaîne SQL littérale fonctionne? Ma compréhension de la déclaration exec est qu'il exécute simplement le SQL en ligne, est-ce incorrect?
  3. (Pas optimiste) Existe-t-il une meilleure façon d'apporter une modification à une vue à partir d'une procédure stockée?
+0

Je suppose que c'est juste pour faciliter l'analyse. Lorsque vous exécutez 'EXEC' il s'exécute comme un lot différent. –

+0

"Facilité d'analyse" semble un peu un flic pour une suite de base de données soi-disant prêt pour l'entreprise! :) Sauf s'il y a une raison pour laquelle il n'est pas possible d'analyser? Cela semble peu probable .. –

+0

Pourquoi voudriez-vous changer une vue dans un SP? (plutôt que de décomposer votre traitement en plusieurs étapes ou d'avoir plus d'une vue par exemple) – MLT

Répondre

1

Je pense que les réponses sont:

  1. MS veulent éviter d'être exécuté à partir DDL dans les procédures.
  2. Le code compris entre L'instruction exec n'est pas traitée dans le cadre de la procédure. Elle n'est donc pas soumise aux mêmes restrictions que la procédure.
  3. n °

Une autre approche pourrait être d'avoir une table séparée (appelée quelque chose comme swing_table) avec 1 ou 0 enregistrements pour indiquer si la vue doit interroger la production ou autre (sauvegarde?), Respectivement la table - quelque chose comme:

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 

- TRUNCATE swing_table au sein de la procédure lorsque vous voulez, erm, balancer la table - car TRUNCATE est pas une commande transactionnelle, il doit exécuter immédiatement. `ALTER VIEW` doit être la seule déclaration dans le lot

+0

Oh c'est une bonne idée, ça marchera très bien. –