¿Por qué no puede SQL Server alterar una vista en un procedimiento almacenado?
-
02-10-2019 - |
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:
- ¿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?
- ¿Por qué la solución a través
exec
ing lo literal trabajo cadena SQL? Mi comprensión de la declaraciónexec
es que simplemente ejecuta el SQL en línea, es que incorrecto? - (No optimista) ¿Hay alguna forma mejor de realizar un cambio en una vista desde dentro de un procedimiento almacenado?
Solución
Creo que las respuestas son:
- MS quieren evitar DDL se ejecuta desde dentro de los procedimientos.
- 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
- 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