Do stwierdzenia „generalnie nie” w odpowiedzi Paula White'a, mam nadzieję, że poniższa mam bezpośrednią odpowiedź na pytanie, ale służy także do pokazania systemowych ograniczeń takiego procesu i odsuwa cię od metod, które nie nadają się do łatwego zarządzania i ujawnienia ryzyko
To może być wymienione wiele razy nie robić DDL zmienia ten sam czas robicie DML. Dobre programowanie oddziela te funkcje, aby zachować wsparcie i uniknąć zmian ciągów spaghetti.
I jak zwięźle zauważył Paul, SQL Server działa partiami .
Teraz, dla tych, którzy wątpią w to, to prawdopodobnie nie działa w twoim przypadku, ale niektóre wersje, takie jak 2017, mogą faktycznie działać! Oto dowód:
[KOD TESTOWY - MOŻE nie działać w wielu wersjach SQL Server]
USE master
GO
CREATE TABLE foo (a VARCHAR(11) )
GO
BEGIN TRANSACTION;
INSERT INTO dbo.foo (a)
VALUES ('entry')
/*****
[2] Check Values
*****/
SELECT a FROM dbo.foo
/*****
[3] Add Column
*****/
ALTER TABLE dbo.foo
ADD b VARCHAR(11)
/*****
[3] Insert value into this new column in the same batch
-- Again, this is just an example. Please do not do this in production
*****/
IF EXISTS (SELECT * FROM sys.columns WHERE object_ID('foo') = object_id
AND name = 'b')
INSERT INTO dbo.foo (b)
VALUES ('d')
COMMIT TRANSACTION;
/*****
[4] SELECT outside transaction
-- this will fail
*****/
--IF EXISTS (SELECT * FROM sys.columns WHERE object_ID('foo') = object_id
-- AND name = 'b')
-- SELECT b FROM dbo.foo
-- this will work...but a SELECT * ???
IF EXISTS (SELECT * FROM sys.columns WHERE object_ID('foo') = object_id
AND name = 'b')
SELECT * FROM dbo.foo
DROP TABLE dbo.foo
[WNIOSEK]
Więc tak, możesz wykonać DDL i DML w tej samej partii dla niektórych wersji lub poprawek SQL Server, jak wskazuje @AndriyM - dbfiddle na SQL 2017 wskazuje, ale nie wszystkie DML są obsługiwane i nie ma gwarancji, że zawsze tak będzie. Jeśli to działa, może to być aberracja Twojej wersji SQL Server, co może powodować dramatyczne problemy podczas łatania lub migracji do nowych wersji.
- Dodatkowo, ogólnie rzecz biorąc twój projekt powinien przewidywać zmiany. Rozumiem obawy związane z modyfikowaniem / dodawaniem kolumn w tabeli, ale możesz odpowiednio zaprojektować to w partiach.
[DODATKOWY KREDYT]
Jeśli chodzi o instrukcję EXISTS, jak stwierdził Paul, istnieje wiele innych sposobów sprawdzania poprawności kodu przed przejściem do następnego kroku w kodzie.
- Instrukcja EXISTS może pomóc w utworzeniu kodu, który działa na wszystkich wersjach SQL Server
- Jest to funkcja logiczna, która umożliwia złożone kontrole w jednej instrukcji