2010-06-09 19 views
5

si tengo un procedimiento almacenado dicenAñadir una columna y actualizarlo en el mismo procedimiento almacenado en SQL Server 2008

CREATE PROCURE w AS 

ALTER TABLE t ADD x char(1) 

UPDATE t set x =1 

Incluso cuando se me permite crear ese procedimiento almacenado (si creo que cuando x existe), cuando se ejecuta, hay un error en la instrucción UPDATE porque la columna x no existe.

¿Cuál es la forma convencional de lidiar con esto, debe aparecer todo el tiempo? Puedo solucionarlo poniendo la ACTUALIZACIÓN dentro de EXEC, ¿hay alguna otra/mejor manera?

Gracias

+3

¿Por qué estás modificando el esquema de la tabla en s sproc? –

+0

quelle horreur ¿eh? Es una decisión, tal vez mala. La tabla que estoy modificando es aquella en la que se cargan los datos brutos. Y habrá diferentes tablas con diferentes shemas. En todos los casos, necesitarán agregar estas dos columnas que no están en la fuente. Las columnas son "identificación impositiva real" y "es el taxid una idea programáticamente inventada". Entonces, dar el paso en el proceso de s es más una forma de comunicarse con los humanos usando el procedimiento s que "este es el punto de no retorno, debes inventar el número de taxid aquí si no obtuviste uno válido" . – TortTupper

Respuesta

2

En lugar de agregar una columna como ésta y luego actualizar su valor, se puede añadir una columna con un valor por defecto

CREATE PROCEDURE w AS 

ALTER TABLE t ADD x char(1) NOT NULL CONSTRAINT abc DEFAULT 1 
+0

¡Solución elegante! Pero funcionará, supongo, solo si la nueva columna no permite NULL – abatishchev

+0

Gracias, pero 1 no es realmente el valor que quiero, me gustaría actualizar la nueva columna a un valor de una cláusula "FROM"; Acabo de tener 1 en mi ejemplo como marcador de posición para mostrar algo simple que causó el error. – TortTupper

+0

que primero obtenga el valor en varible y que use aquí seleccione @@ variable = 1 ALTER TABLE t ADD x char (1) NOT NULL CONSTRAINT abc DEFAULT @@ variable puede funcionar para usted –

3

ALTER TABLE en el contexto de la primera transacción y UPDATE en el contexto de 2nd:

CREATE PROCEDURE w 
AS 
    BEGIN TRAN 
     ALTER TABLE .. 
    COMMIT 

    BEGIN TRAN 
     UPDATE .. 
    COMMIT 
END 
+0

Suena atractivo pero no puedo hacerlo funcionar : CREAR PROCEDIMIENTO p AS COMENZAR TRAN ALTER TABLE t ADD x CHAR (1) COMMIT COMENZAR TRAN ACTUALIZACIÓN t SET x = 1 COMMIT Si uso "END" obtengo una sintaxis errror. Si lo creo con éxito el procedimiento, todavía obtengo el mismo error si "x" no existe en tiempo de ejecución (y obtendría otro error si existiera) – TortTupper

+0

@TortTupper: Parece que es una limitación de SQL Server. ¿Qué tal archivar un error en MS.Connect? Yo lo votaría mejor. Mi solución alternativa: crear 2 SP separados y llamarlos paso a paso. O crea un tercero que llamará a 1st y 2nd – abatishchev

+0

@TortTupper: Otra idea de por qué sucede. SQL Server no puede crear un SP que acceda a una columna que aún no existió durante la creación del SP. Así que tal vez su tarea es imposible aún ... ( – abatishchev

-1

Creo que deberías agregar una instrucción GO justo después del Create.

El servidor SQL enviará la creación, y luego su actualización funcionará bien.

0

El problema con el que se está encontrando es que su actualización se valida con la tabla existente antes de que ejecute la creación para su procedimiento.

Si está comprometido con esto, todo lo que tiene que hacer es asegurarse de que la tabla no exista al crear/modificar el procedimiento, que lleva al analizador por la ruta de resolución de nombre diferido debido a la inexistencia objetos.

Después de crear el procedimiento, puede crear su tabla.

Supongo que su proceso cae/crea la tabla o realmente no necesitaría realmente un procedimiento como este de todos modos.

Cuestiones relacionadas