Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Кто-нибудь может обьяснить почему так?  [new]
Newber
Member

Откуда: Planet Earth
Сообщений: 107
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'tablename') AND type in (N'U'))
	BEGIN
		PRINT N'Dropping [tablename]'

		INSERT INTO tablename2
			SELECT		*
			FROM	tablename
		
		DROP TABLE [tablename]
	END
GO
это работает
если таблицы нет :)

if exists (select * from information_schema.columns where table_name = 'tablename' and column_name = 'tablecolumn')
	BEGIN
		INSERT INTO tablename2 (tablecolumn)
			SELECT		tablecolumn
			FROM	tablename
			WHERE ISNULL(tablecolumn,'')<>''
					
		ALTER TABLE [tablename] DROP COLUMN [tablecolumn]
	END
GO
а вот это ругается когда колонки нет в таблице

то есть первый IF нормально отрабатывает, не заходит в содержимое и не выполняет
а второй почему-то лезет и при этом скрипт вылетает
пришлось писать
execute('....')
8 июл 11, 12:26    [10944632]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Потому что при компиляции скрипта проверки IF-ов не происходит
8 июл 11, 12:27    [10944646]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
Может потому что?
Newber
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'tablename') AND type in (N'U'))
	BEGIN
		PRINT N'Dropping [tablename]'

		INSERT INTO tablename2
			SELECT		*
			FROM	tablename
		
		DROP TABLE [tablename]
	END
GO
это работает
если таблицы нет :)

if exists (select * from information_schema.columns where table_name = 'tablename' and column_name = 'tablecolumn')
	BEGIN
		INSERT INTO [color=red]tablename2[/color] (tablecolumn)
			SELECT		tablecolumn
			FROM	tablename
			WHERE ISNULL(tablecolumn,'')<>''
					
		ALTER TABLE [tablename] DROP COLUMN [tablecolumn]
	END
GO
а вот это ругается когда колонки нет в таблице

то есть первый IF нормально отрабатывает, не заходит в содержимое и не выполняет
а второй почему-то лезет и при этом скрипт вылетает
пришлось писать
execute('....')
8 июл 11, 12:30    [10944667]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
Newber
Member

Откуда: Planet Earth
Сообщений: 107
ну на первый IF компилятор не ругается
на второй ругается..
хотя в первом случае таблицы нет
во втором случае нет колонки в таблице.
8 июл 11, 12:33    [10944691]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Newber
ну на первый IF компилятор не ругается
на второй ругается..
хотя в первом случае таблицы нет
во втором случае нет колонки в таблице.

1. Компилятор вообще игнорирует IF-ы и компилирует только ваши INSERT-ы
2. Отложенное разрешение имен действует на весь объект, а не на его часть

Сообщение было отредактировано: 8 июл 11, 12:35
8 июл 11, 12:35    [10944710]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
Newber
Member

Откуда: Planet Earth
Сообщений: 107
Glory
Newber
ну на первый IF компилятор не ругается
на второй ругается..
хотя в первом случае таблицы нет
во втором случае нет колонки в таблице.

1. Компилятор вообще игнорирует IF-ы и компилирует только ваши INSERT-ы
2. Отложенное разрешение имен действует на весь объект, а не на его часть

а почему тогда в первом случае нормально прошли?
при отсутствующей таблице
8 июл 11, 12:36    [10944723]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
Newber
Member

Откуда: Planet Earth
Сообщений: 107
Newber,

Понял вроде , сразу не увидел пункт 2. Спасибо.
8 июл 11, 12:38    [10944738]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
Newber
Member

Откуда: Planet Earth
Сообщений: 107
Glory
Newber
ну на первый IF компилятор не ругается
на второй ругается..
хотя в первом случае таблицы нет
во втором случае нет колонки в таблице.

1. Компилятор вообще игнорирует IF-ы и компилирует только ваши INSERT-ы
2. Отложенное разрешение имен действует на весь объект, а не на его часть

вообщем в таких случаях лучше работать после IF
c execute('...')?
8 июл 11, 12:38    [10944749]     Ответить | Цитировать Сообщить модератору
 Re: Кто-нибудь может обьяснить почему так?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Newber
Glory
пропущено...

1. Компилятор вообще игнорирует IF-ы и компилирует только ваши INSERT-ы
2. Отложенное разрешение имен действует на весь объект, а не на его часть

вообщем в таких случаях лучше работать после IF
c execute('...')?

Да, только динамические запросы компилируются в момент их запуска.
8 июл 11, 12:40    [10944763]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить