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

Откуда:
Сообщений: 46
Почему сервер выдает ошибку при использовании внутри конструкции if...else... select'а?

IF object_id('tempdb..#FoundContractIDs') IS NULL
SELECT #ContractByPolicy.InsuranceContractID INTO #FoundContractIDs FROM #ContractByPolicy
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByPolicy.InsuranceContractID FROM #ContractByPolicy)
IF object_id('tempdb..#FoundContractIDs') IS NULL
SELECT #ContractByClient.InsuranceContractID INTO #FoundContractIDs FROM #ContractByClient
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByClient.InsuranceContractID FROM #ContractByClient)

Ругается на второй SELECT...
10 ноя 04, 10:20    [1093464]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37102
Матом?
Или сообщение какое-нить выдает?
10 ноя 04, 10:25    [1093480]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Потому что компилятор не знает заранее как будет выполнятся ваш скрипт. И поэтому считает двойное создание временной таблицы #FoundContractIDs за ошибку
10 ноя 04, 10:28    [1093490]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
methos
Member

Откуда:
Сообщений: 46
Но это же не логично!!! Таблица #FoundContractIDs никак не будет создаваться дважды! Получается что компилятор не пропускает вполне корректный код...
10 ноя 04, 10:43    [1093549]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37102
methos
Но это же не логично!!! Таблица #FoundContractIDs никак не будет создаваться дважды! Получается что компилятор не пропускает вполне корректный код...

Создавайте таблицу один раз.
10 ноя 04, 10:46    [1093565]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Но это же не логично!!! Таблица #FoundContractIDs никак не будет создаваться дважды!
На этапе компиляции это никак невозможно выяснить.

Получается что компилятор не пропускает вполне корректный код...
Хм. насколько он логически корректен если таблица может каждый раз создаватся с разной структурой ?
10 ноя 04, 10:47    [1093566]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
methos
Member

Откуда:
Сообщений: 46
Таблица не может создаваться каждый раз так как в if идет проверка на ее существование. Соответственно если ее нет, то она создается, а если есть - то из нее удаляется часть записей.
А как создать один раз? На момент выполнения этого куска кода таблицы #ContractByPolicy и #ContractByClient могут быть пустыми (или одна из них)... Тогда #FoundContractIDs тоже должна быть пустой...
10 ноя 04, 10:56    [1093605]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37102
автор
А как создать один раз?

Create table если структура таблиц одинаковая. Если разная - делайте select into в две разные таблицы, после их можно union'ом объединить.
10 ноя 04, 11:00    [1093622]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Таблица не может создаваться каждый раз так как в if идет проверка на ее существование. Соответственно если ее нет, то она создается, а если есть - то из нее удаляется часть записей.
Это ваши предположения о том как сработает скрипт.
Но дело в том что компилятор не проверяет ваши предположения.

А как создать один раз? На момент выполнения этого куска кода таблицы #ContractByPolicy и #ContractByClient могут быть пустыми (или одна из них)... Тогда #FoundContractIDs тоже должна быть пустой...

CREATE TABLE #FoundContractIDs ...
...
IF object_id('tempdb..#FoundContractIDs') IS NULL
INSERT #FoundContractIDs
SELECT #ContractByPolicy.InsuranceContractID FROM #ContractByPolicy
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByPolicy.InsuranceContractID FROM #ContractByPolicy)

IF object_id('tempdb..#FoundContractIDs') IS NULL
INSERT #FoundContractIDs
SELECT #ContractByClient.InsuranceContractID FROM #ContractByClient
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByClient.InsuranceContractID FROM #ContractByClient)
10 ноя 04, 11:02    [1093631]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
methos
Member

Откуда:
Сообщений: 46
Спасибо за помощь. Все работает... Вот только интересно, почему использование временных таблиц значительно ускоряет время выполнения запроса в отличии от сложного запроса с вложенными подзапросами...
10 ноя 04, 11:23    [1093748]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37102
methos
Спасибо за помощь. Все работает... Вот только интересно, почему использование временных таблиц значительно ускоряет время выполнения запроса в отличии от сложного запроса с вложенными подзапросами...

Ха, бывает. Потому, что сиквел находит оптимальный(но не лучший, не успевает просто) план выполнения и начинает объединять не так, как следутет. Или статистика кривая. Или еще что-нить. Можно попытаться шаманить хинтами ...
10 ноя 04, 11:27    [1093762]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
methos
Member

Откуда:
Сообщений: 46
Glory

CREATE TABLE #FoundContractIDs ...
...
IF object_id('tempdb..#FoundContractIDs') IS NULL
INSERT #FoundContractIDs
SELECT #ContractByPolicy.InsuranceContractID FROM #ContractByPolicy
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByPolicy.InsuranceContractID FROM #ContractByPolicy)

IF object_id('tempdb..#FoundContractIDs') IS NULL
INSERT #FoundContractIDs
SELECT #ContractByClient.InsuranceContractID FROM #ContractByClient
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByClient.InsuranceContractID FROM #ContractByClient)


А как в таком виде может object_id('tempdb..#FoundContractIDs') возвращать NULL если перед этим таблица уже создана?
Я просто ввел флажок и по нему ориентируюсь. Как только в #FoundContractIDs добавлены записи ставлю его в 1 и в остальных условных выражениях срабатывает удаление...
10 ноя 04, 11:27    [1093765]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
methos
Member

Откуда:
Сообщений: 46
Теперь это выглядит так:

CREATE TABLE #FoundContractIDs (InsuranceContractID BIGINT)
DECLARE @bAnyAdded BIT
SET @bAnyAdded = 0
IF @bAnyAdded = 0
BEGIN
INSERT INTO #FoundContractIDs SELECT #ContractByPolicy.InsuranceContractID FROM #ContractByPolicy
SET @bAnyAdded = 1
END
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByPolicy.InsuranceContractID FROM #ContractByPolicy)
IF @bAnyAdded = 0
BEGIN
INSERT INTO #FoundContractIDs SELECT #ContractByClient.InsuranceContractID FROM #ContractByClient
SET @bAnyAdded = 1
END
ELSE
DELETE FROM #FoundContractIDs WHERE #FoundContractIDs.InsuranceContractID NOT IN (SELECT #ContractByClient.InsuranceContractID FROM #ContractByClient)
10 ноя 04, 11:29    [1093779]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Glory
Member

Откуда:
Сообщений: 104760
А как в таком виде может object_id('tempdb..#FoundContractIDs') возвращать NULL если перед этим таблица уже создана?
Я просто ввел флажок и по нему ориентируюсь.

Откуда же мне знать какую _логику_ вы программируете ?
10 ноя 04, 11:32    [1093802]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
methos
Member

Откуда:
Сообщений: 46
И всетаки, почему использование временных таблиц значительно ускоряет время выполнения запроса в отличии от сложного запроса с вложенными подзапросами и джойнами самого на себя?
10 ноя 04, 12:15    [1094073]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37102
methos
И всетаки, почему использование временных таблиц значительно ускоряет время выполнения запроса в отличии от сложного запроса с вложенными подзапросами и джойнами самого на себя?

https://www.sql.ru/forum/actualthread.aspx?tid=136849#1093762
10 ноя 04, 12:18    [1094094]     Ответить | Цитировать Сообщить модератору
 Re: Проблема условных выражений...  [new]
Glory
Member

Откуда:
Сообщений: 104760
И всетаки, почему использование временных таблиц значительно ускоряет время выполнения запроса в отличии от сложного запроса с вложенными подзапросами и джойнами самого на себя?
Потому что меняется план выполнения.
Который зависит
- от количества таблиц в запросе(включая и таблицы из неиндексированных представлений)
- от количества записей в каждой таблице
- от наличия индексов в каждой таблице
- от наличия статистики в каждой таблице и ее актуальности
и тд
10 ноя 04, 12:19    [1094101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить