2010-06-09 8 views
5

jeśli mam procedurę przechowywaną powiedziećDodaj kolumnę i aktualizować go w tej samej procedurze przechowywanej w SQL Server 2008

CREATE PROCURE w AS 

ALTER TABLE t ADD x char(1) 

UPDATE t set x =1 

Nawet wtedy, gdy pozwala mi stworzyć tę procedurę przechowywaną (jeśli tworzę go, gdy x istnieje), po uruchomieniu wystąpił błąd w instrukcji UPDATE, ponieważ kolumna x nie istnieje.

Jaki jest konwencjonalny sposób poradzenia sobie z tym, musi on przychodzić przez cały czas? Mogę obejść to poprzez umieszczenie UPDATE wewnątrz EXEC, czy istnieje inny/lepszy sposób?

Dzięki

+3

Dlaczego na ziemi modyfikujesz schemat tabeli w s sproc? –

+0

quelle horreur huh? To wyrok sądowy, może zły. Zmieniam tabelę, do której przesyłane są dane surowe. I będą różne tabele z różnymi shemami. We wszystkich przypadkach będą potrzebować tych dwóch dodanych kolumn, których nie ma w źródle. Kolumny to "rzeczywisty identyfikator podatkowy", a "to taksówkarz zaprogramowany programowo". Tak więc posiadanie kroku w proc jest bardziej sposobem komunikowania się ludziom za pomocą soku, że "to jest punkt bez powrotu, musisz uzupełnić tutaj numer taksydu, jeśli nie dostałeś ważnego" . – TortTupper

Odpowiedz

2

Zamiast dodanie kolumny jak ta, a następnie aktualizując swoją wartość, można dodać kolumnę o wartości domyślnej

CREATE PROCEDURE w AS 

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

Eleganckie rozwiązanie! Ale będzie działać, jak sądzę, tylko wtedy, gdy nowa kolumna nie zezwala na NULL – abatishchev

+0

Dzięki, ale 1 nie jest faktycznie wartością, którą chcę tam, chcę zaktualizować nową kolumnę do wartości z klauzuli "Z"; Właśnie miałem 1 w moim przykładzie jako symbol zastępczy, aby pokazać coś prostego, co spowodowało błąd. – TortTupper

+0

niż najpierw pobierz wartość zmienną i użyj tutaj wybierz @@ zmienna = 1 ZMIANA TABELI t ADD x znak (1) NOT NULL CONSTRAINT abc DEFAULT @@ zmienna może pracować dla ciebie –

3

ALTER TABLE w kontekście 1 transakcję i UPDATE w kontekście of 2nd:

CREATE PROCEDURE w 
AS 
    BEGIN TRAN 
     ALTER TABLE .. 
    COMMIT 

    BEGIN TRAN 
     UPDATE .. 
    COMMIT 
END 
+0

Dźwięki są aktywne, ale nie mogę ich uruchomić : Create Procedure p CO UŻYCIEM tran ALTER Tabela t ADD x CHAR (1) zatwierdzanie UŻYCIEM TRAN UPDATE t zbioru x = 1 COMMIT Jeśli użyję "END", otrzymam błąd składni. Jeśli pomyślnie utworzę procedurę, nadal otrzymam ten sam errror, jeśli "x" nie istnieje w czasie wykonywania (i pojawi się kolejny błąd, jeśli istniał) – TortTupper

+0

@TortTupper: Wydaje się, że jest to ograniczenie SQL Server. W jaki sposób napisać błąd na MS.Connect? Chciałbym to zrobić. Moje obejście: utwórz 2 osobne SP i wywołaj je po kolei. Lub stwórz 3, który zadzwoni na 1 i 2 – abatishchev

+0

@TortTupper: Kolejny pomysł, dlaczego tak się dzieje. Program SQL Server nie może utworzyć pliku SP uzyskującego dostęp do kolumny, która jeszcze nie istniała podczas tworzenia dodatku SP. Więc może twoje zadanie jest niemożliwe jeszcze ... ( – abatishchev

-1

Myślę, że powinieneś dodać instrukcję GO tuż po utworzeniu.

Serwer Sql wyśle ​​kreację tak, a wtedy twoja aktualizacja będzie działać poprawnie.

0

Występuje problem polegający na tym, że aktualizacja jest sprawdzana na podstawie istniejącej tabeli, zanim zostanie wykonana operacja tworzenia.

Jeśli jesteś zaangażowany w to wszystko, co musisz zrobić, to upewnij się, że tabela nie istnieje podczas tworzenia/zmiany procedury, co powoduje, że parser w dół odroczonej ścieżki rozpoznawania nazw ze względu na nieistniejącą obiekty.

Po utworzeniu procedury można utworzyć tabelę.

Zakładam, że Twój proces upuszcza/tworzy już tabelę lub naprawdę nie potrzebowałbyś takiej procedury.

Powiązane problemy