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

Откуда: Киев
Сообщений: 84
Уважаемые Олл!
Никто не нашел решения задачи совместить table hint OPTION в запросе условия конструкции IF?
Пример для ясности, запрос:
if exists (
	select *
	from sysobjects
	option (merge join)
)
	print 1
Вернет результат (Для любой версии сервера):

Server: Msg 156, Level 15, State 1, Line 5
Неправильный синтаксис около ключевого слова "option".

Без IF всё естественно работает.
Сходу, ничего про это ограничение в БОЛе не нашёл, возможно плохо искал. Может кто пальцем тыкнет, или ещё лучше покажет, куда ещё этот "option" можно пристроить?

Цена вопроса в том, что на хинты в джоине в ряде случаев компилятор просто не реагирует, а вот на "option" - да. Если в моём случае запросы с (merge join) выполняется за 50мс, то без - 20сек. Индексы в помощь построить нельзя так как нужны неуникальные, а это в батчах с табличными переменными.
16 июн 09, 00:22    [7302860]     Ответить | Цитировать Сообщить модератору
 Re: Конструкция IF...ELSE и OPTION  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Andret,

declare @dup bit set @bit = null
select top(1) @dup = 1 from .... option(...)
if @dup = 1 ....
?
16 июн 09, 00:24    [7302870]     Ответить | Цитировать Сообщить модератору
 Re: Конструкция IF...ELSE и OPTION  [new]
Andret
Member

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

Ну да, можно пойти старым дедовским способом :-(.
Но думаю, приму вашу рекомендацию.

Вот только интересно, с чем связанно такое ограничение. В этом есть скрытый смысл, или неисправленная ошибка в парсере T-SQL?

Помню, на "option" ругался и ешё в каких-то конструкциях.
16 июн 09, 00:42    [7302919]     Ответить | Цитировать Сообщить модератору
 Re: Конструкция IF...ELSE и OPTION  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Andret
Вот только интересно, с чем связанно такое ограничение. В этом есть скрытый смысл, или неисправленная ошибка в парсере T-SQL?

Помню, на "option" ругался и ешё в каких-то конструкциях.

Емнип, это всё расписано в БОЛ.
16 июн 09, 00:44    [7302927]     Ответить | Цитировать Сообщить модератору
 Re: Конструкция IF...ELSE и OPTION  [new]
Andret
Member

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

Нашёл только это:
БОЛ
Подсказки в запросе нельзя указывать в инструкции INSERT, кроме случая, когда внутри инструкции используется предложение SELECT.

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


Просто по отношению к IF это как-то неочевидно.
Хотя, наверное, дело не в IF.

Запрос:
(
select	*
from	sysobjects
option	(merge join)
)

Тоже работать не будет из-за скобок.
Значит, парсер видит наложенные скобки и ему уже этого достаточно для возврата ошибки. А зря!
Вывод: не должно быть ни одной наложенной скобки.
16 июн 09, 01:04    [7302967]     Ответить | Цитировать Сообщить модератору
 Re: Конструкция IF...ELSE и OPTION  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Andret,

под exists идет не select statement, а query expression (или как-то так), который является ограниченным select statement, посмотри по синтаксису.
Обрати внимание, что OPTION является частью именно <SELECT statement>, а <query_expression>
хотя вот в под, например, order by можно в подзапросе использовать :(


EXISTS subquery
Arguments
subquery
Is a restricted SELECT statement. The COMPUTE clause and the INTO keyword are not allowed. For more information, see the information about subqueries in SELECT (Transact-SQL).


+
<SELECT statement> ::=  
    [WITH <common_table_expression> [,...n]]
    <query_expression> 
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } 
  [ ,...n ] ] 
    [ COMPUTE 
  { { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ] 
  [ BY expression [ ,...n ] ] 
    ] 
    [ <FOR Clause>] 
    [ OPTION ( <query_hint> [ ,...n ] ) ] 
<query_expression> ::= 
    { <query_specification> | ( <query_expression> ) } 
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }
        <query_specification> | ( <query_expression> ) [...n ] ] 
<query_specification> ::= 
SELECT [ ALL | DISTINCT ] 
    [TOP ( expression ) [PERCENT] [ WITH TIES ] ] 
    < select_list > 
    [ INTO new_table ] 
    [ FROM { <table_source> } [ ,...n ] ] 
    [ WHERE <search_condition> ] 
    [ <GROUP BY> ] 
    [ HAVING < search_condition > ]
16 июн 09, 09:03    [7303267]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить