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

Откуда: Челябинск
Сообщений: 1853
Server 2005. Таблицы tt1 и tt2 совершенно разной структуры
текст внутри процедуры
begin try
	select * from (select * from tt1 except select * from tt2) z
end try
begin catch
	set @Yes=0
	return
end catch


выдаёт:
автор
Сообщение 205, уровень 16, состояние 1, процедура QueriesHaveSameResult, строка 25
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

при выполнении alter proc (не при вызове процедуры)
До сих пор в T_SQL я try-catch не пользовался (в Си - регулярно)
Надо полагать я чего то не знаю или не понимаю.
Подскажите пожалуйста.
14 дек 12, 17:00    [13633495]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а причем тут трай кетч ???
14 дек 12, 17:02    [13633517]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
SirMix
Member

Откуда: Киев
Сообщений: 79
muk07,

насколько я понимаю, то кол-во колонок в таблицах tt1 и tt2 неодинаково, а для операции эксепт оно должно быть таковым, если мне не изменяет память...
14 дек 12, 17:03    [13633520]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
Совершенно верно - в блоке try - ошибка.
Я сознательно на это иду, расчитывая на то, что тут же попаду без возражений в блок catch.
Ан нет!
14 дек 12, 17:05    [13633542]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
Konst_One
Member

Откуда:
Сообщений: 11562
уровень ошибки не тот
14 дек 12, 17:06    [13633548]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
muk07,

Какая цель преследуется, если заранее известно, что таблицы разной структуры?
14 дек 12, 17:08    [13633562]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
Мне нужно выяснить одинаковы ли результаты 2х запросов @sql1 и @sql2, априорно неизвестных:
Alter proc dbo.QueriesHaveSameResult(@sql1 varchar(4000), @sql2 varchar(4000), @Yes bit output) 
............
14 дек 12, 17:12    [13633601]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
и тем более сервер не знает что таблицы разные, когдо выполняется alter proc
14 дек 12, 17:15    [13633638]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
Гость333
Member

Откуда:
Сообщений: 3683
muk07
и тем более сервер не знает что таблицы разные, когдо выполняется alter proc

А каким образом создаются tt1 и tt2?
14 дек 12, 17:19    [13633678]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
muk07
Мне нужно выяснить одинаковы ли результаты 2х запросов @sql1 и @sql2, априорно неизвестных:
Alter proc dbo.QueriesHaveSameResult(@sql1 varchar(4000), @sql2 varchar(4000), @Yes bit output) 
............
[src]У вас динамика. Как вы умудрились получить ошибку при alter proc?
14 дек 12, 17:22    [13633704]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
tt1 и tt2 - результат выполнения @sql1 и @sql2
14 дек 12, 17:23    [13633705]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
[invm автор]У вас динамика. Как вы умудрились получить ошибку при alter proc? [/quote]
Это не я - это сервер так реагирует
14 дек 12, 17:26    [13633738]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Процедуру целиком покажите.
14 дек 12, 17:34    [13633816]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
muk07
Это не я - это сервер так реагирует
На что реагирует???

Вы приведите текст запроса, текст ошибки, и что вам нужно в итоге получить (чего вы добиваетесь).

Текст в стартовом топике не может выполнится, так что всё получается как в С:
muk07
До сих пор в T_SQL я try-catch не пользовался (в Си - регулярно)
Если в коде на С синтаксическая ошибка, то на этапе компиляции вы тоже в try-catch её не отловите.
14 дек 12, 17:35    [13633829]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
Я только начал писать процедуру. Пока вот так:
Alter proc dbo.QueriesHaveSameResult(@sql1 varchar(4000), @sql2 varchar(4000), @Yes bit output) 
-- @sql1, @sql2 - запросы (select...)
-- Yes - результаты запросов совпадают
AS
BEGIN
declare @s1 varchar(4000), @s2 varchar(4000), @n1 int, @n2 int,@n int

if exists (select name from sysobjects where name='tt1')
  drop table tt1
if exists (select name from sysobjects where name='tt2')
  drop table tt2

set @s1='select * into tt1 from ('+@sql1+') t'
exec (@s1)
set @n1=@@Rowcount

set @s2='select * into tt2 from ('+@sql2+') t'
exec (@s2)
set @n2=@@Rowcount

if @n1<>@n2 begin
	set @Yes=0
	return
end

begin try
	select * from (select * from tt1 except select * from tt2) z
end try
begin catch
	set @Yes=0
	return
end catch	

set @n=@@ROWCOUNT
if @n<>0 begin
	set @Yes=0	
	return 
end

set @Yes=1
select @Yes zzz
END
GO
14 дек 12, 17:41    [13633879]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
Гость333
Member

Откуда:
Сообщений: 3683
muk07,

Перед компиляцией процедуры удалите объекты tt1 и tt2.
Кстати, параллельная работа процедуры из разных коннекций у вас не предполагается? Что, по-вашему, тогда произойдёт?
14 дек 12, 17:46    [13633910]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
Параллельная работа не предполагается.
После удаления tt1 tt2 перед компиляцией alter прошло без ошибок.
Спасибо.
А сервер неправ - его поведение нелогично.
14 дек 12, 17:52    [13633951]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
Alter proc dbo.QueriesHaveSameResult(@sql1 varchar(4000), @sql2 varchar(4000), @Yes bit output) 
-- @sql1, @sql2 - запросы (select...)
-- Yes - результаты запросов совпадают
AS
BEGIN
declare @n int

begin try
	exec('(' + @sql1 + ') execept (' + @sql2 + ')')
end try
begin catch
	set @Yes=0
	return
end catch	

set @n=@@ROWCOUNT
if @n<>0 begin
	set @Yes=0	
	return 
end

set @Yes=1
select @Yes zzz
END
GO
14 дек 12, 17:53    [13633956]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
muk07
А сервер неправ - его поведение нелогично.
Сервер абсолютно прав. А вы почитайте про deferred name resolution.
14 дек 12, 18:08    [13634077]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
В моем и вашем тексте нужно дописать еще совпадение intersect.
заклинания "deferred name resolution" не слышал.
Посмотрю.
Ещё раз спасибо.
14 дек 12, 18:13    [13634107]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
invm
Member

Откуда: Москва
Сообщений: 9633
muk07
В моем и вашем тексте нужно дописать еще совпадение intersect.

exec('((' + @sql1 + ') execept (' + @sql2 + ')) union ((' + @sql2 + ') execept (' + @sql1 + '))')
14 дек 12, 18:30    [13634190]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
except
Да, так лучше.

































l
14 дек 12, 19:14    [13634426]     Ответить | Цитировать Сообщить модератору
 Re: Что неверно в try-catch  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1853
Такая хорошая идея провалилась:
сервер
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.
15 дек 12, 12:04    [13635984]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить