Можно ли сказать SSMS не проверять, существует ли столбец в сценарии t-sql? - PullRequest
4 голосов
/ 20 июля 2010

Я пытался гуглить, но не нашел пути

У меня есть скрипт t-sql, который добавляет новый столбец в таблицу, затем заполняет эти столбцы значениями, зависящими от некоторых других столбцов в той же таблице, и, наконец, удаляет некоторые столбцы. Это все отлично работает.

Проблема возникает, когда я хочу снова запустить скрипт. У меня есть предложение if, которое проверяет, существуют ли отсутствующие столбцы, но SSMS по-прежнему жалуется и отображает сообщения об ошибках, даже если код внутри предложения if не запускается. Сценарий должен запускаться более одного раза, и я не хочу, чтобы отображались сообщения об ошибках!

В коде (очевидно, тестовый код, здесь не нужно выводить производственный код ...):

create table test (
 Name text,
 Switch int,
 ValueA int,
 ValueB int)
go

insert into test values ('Name', 0, 5, 10)

if not exists (select 1 from INFORMATION_SCHEMA.COLUMNS
      where COLUMN_NAME = 'ValueC' and TABLE_NAME = 'test')
begin
 alter table test
 add ValueC int
end
go

-- This batch rasies error when run more then once!
if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 update test
 set ValueC = (select case Switch
      when 0 then (select (ValueA - ValueB))
      when 1 then (select (ValueB - ValueA))
     end)
end
go

if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 alter table test drop column ValueA
end
go

select * from test
--Name 0 10 -5

Вот сообщение об ошибке:

Msg 207, Level 16, State 1, Line 6
Invalid column name 'ValueA'.
Msg 207, Level 16, State 1, Line 7
Invalid column name 'ValueA'.

Приветствие --Jocke

Ответы [ 3 ]

2 голосов
/ 20 июля 2010

Да, это возможно без динамического SQL, но с небольшим обходным решением.Я бы просто использовал для этого EXEC.

Здесь описано поведение * SQL 2000

Эрланд Соммарског упоминает "как только все таблицы в запросе существуют, SQL Serverвыполняет полные проверки по запросу. "

Таким образом, добавление незапрашиваемой ссылки в запросе в таблицу, которая не существует, компиляция может быть отложена.С этой настройкой приведенный ниже скрипт может быть запущен несколько раз без получения ошибки.

insert into test values ('Name', 0, 5, 10)

if not exists (select 1 from INFORMATION_SCHEMA.COLUMNS
      where COLUMN_NAME = 'ValueC' and TABLE_NAME = 'test')
begin
 alter table test
 add ValueC int
end
go

create table #dummy
(i int)

-- This batch raised error when run more then once!
if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 update test
 set ValueC = (select case Switch
      when 0 then (select (ValueA - ValueB))
      when 1 then (select (ValueB - ValueA))
     end) where not exists(select * from #dummy)
end

drop table #dummy
go


if exists (select 1 from INFORMATION_SCHEMA.COLUMNS
     where COLUMN_NAME = 'ValueA' and TABLE_NAME = 'test')
begin
 alter table test drop column ValueA
end



go


select * from test
--Name 0 10 -5
0 голосов
/ 03 августа 2016

У меня была именно эта проблема, и единственное, что сработало для меня, это сохранить сценарий. Закрой его. Затем снова откройте его и запустите в окне запроса.

Кроме того, похоже, что у вас есть нужные GO, но я обнаружил, что если я пропустил GO после проверки, чтобы добавить столбец, тогда даже повторное открытие скрипта не сработало.

0 голосов
/ 20 июля 2010

почему бы вам не использовать временную таблицу или таблицу переменных, добавить последний столбец в объявление, и тогда у вас не возникнет этой проблемы?

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