Как заставить SQL Server игнорировать проверки? - PullRequest
1 голос
/ 08 мая 2009

У меня есть сценарий SQL, который заполняет временный столбец, а затем удаляет столбец в конце сценария. При первом запуске он работает нормально, поскольку столбец существует, а затем он отбрасывается. Сценарий прерывается во второй раз, потому что столбец больше не существует, хотя оператор IF гарантирует, что он не запустится снова. Как мне обойти проверку SQL для этого поля?

IF EXISTS (SELECT name FROM syscolumns 
             WHERE name = 'COLUMN_THAT_NO_LONGER_EXISTS')
BEGIN
   INSERT INTO TABLE1
   (
     COLUMN_THAT_NO_LONGER_EXISTS,
     COLUMN_B,
     COLUMN_C
   )
   SELECT 1,2,3 FROM TABLE2

   ALTER TABLE TABLE1 DROP COLUMN COLUMN_THAT_NO_LONGER_EXISTS
END

Ответы [ 2 ]

5 голосов
/ 08 мая 2009

Однажды у меня была похожая проблема, и я обошел ее, построив все запросы в виде строк и выполнив их с помощью вызова Exec (). Таким образом, запросы (выборки, вставки или что-то еще) не анализируются до тех пор, пока они не будут выполнены.

Хотя это было не красиво и не элегантно.

* 1005 например *

exec('INSERT INTO TABLE1(COLUMN_THAT_NO_LONGER_EXISTS,COLUMN_B,COLUMN_C) SELECT 1,2,3 FROM TABLE2')
0 голосов
/ 08 мая 2009

Вы проверяете, нет ли столбца в другой таблице? Если нет, то вы, вероятно, проверьте таблицу, тоже посмотрите, если утверждение ниже.

Если вы уже делаете это, выполняется ли он в одной транзакции и не поднимает этот отброшенный столбец?

IF Not EXISTS (SELECT name FROM sys.columns 
             WHERE name = 'COLUMN_THAT_NO_LONGER_EXISTS' and Object_Name(object_id) = 'Table1')

Создан быстрый скрипт программы для этого; Можете ли вы подтвердить, что это соответствует тому, что вы пытаетесь сделать, потому что в SQL 2007 по крайней мере это не возвращает ошибку. Если я создаю таблицу и запускаю ее с помощью таблицы alter, она работает; если я тогда запускаю if / insert, который работает даже после удаления таблицы.

create table tblTests
(
TestID int identity (1,1),
TestColA int null,
TestColB int null
)

go -- Ran this on its own



insert into tblTests (TestColA, TestColB)
Select 1,2
go 10
-- Insert some initial data

alter table tblTests
add TestColC Int
go -- alter the table to add new column

-- Run this with column and then after it has removed it

IF EXISTS (SELECT name FROM sys.columns a 
             WHERE name = 'TestColC' AND
             OBJECT_NAME(object_id) = 'tblTests')
Begin
    insert into tblTests (TestColA, TestColB, testcolc)
    select 1,2,3

    alter table tblTests
    drop column TestColC
End
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...