Pregunta

Estoy usando MS SQL Server, y me gustaría para alterar una visión desde dentro de un procedimiento almacenado, mediante la ejecución de algo así como "alter vista VIEWNAME como ([algunos sql])".

A pocas páginas lanzadas por Google afirman que esto no es apoyado directamente (y no están relacionados declaraciones alter-mesa), pero también hay ejemplos de cómo trabajar alrededor de ella utilizando construcciones de esta manera:

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

código de escritura como cadenas literales huele un poco, incluso para SQL.

Mis preguntas:

  1. ¿Por qué este no es compatible? ¿Cuál es la diferencia entre la ejecución de este procedimiento almacenado desde una y funcionando como una declaración independiente?
  2. ¿Por qué la solución a través execing lo literal trabajo cadena SQL? Mi comprensión de la declaración exec es que simplemente ejecuta el SQL en línea, es que incorrecto?
  3. (No optimista) ¿Hay alguna forma mejor de realizar un cambio en una vista desde dentro de un procedimiento almacenado?
¿Fue útil?

Solución

Creo que las respuestas son:

  1. MS quieren evitar DDL se ejecuta desde dentro de los procedimientos.
  2. El código en la declaración Exec no se trata como parte del procedimiento -. Por lo que no está sujeto a las mismas restricciones que el procedimiento
  3. No.

Un enfoque alternativo podría ser tener una tabla separada (llamado algo así como swing_table) de 1 o 0 registros para indicar si la vista debería consultar la producción o la otra tabla, respectivamente, - algo así como (copia de seguridad?):

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 continuación, TRUNCATE dentro del procedimiento cuando desee, erm, oscilación de la mesa -. TRUNCATE ya no es una orden transaccional, se debe ejecutar inmediatamente

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top