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

Определена табличная переменная, например так:
CREATE TYPE [ArrayInt] AS TABLE
(
  ID	INT NOT NULL
);
GO


Пример применения в процедуре
CREATE PROCEDURE [Test]
  @ArrayInt ArrayInt
AS

GO


Вопрос: как в теле хранимой процедуры определить пуста ли табличная переменная или имеет данные?
10 ноя 14, 12:52    [16821832]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
почему вы всё время называете "табличная переменная" ?
у вас же параметр табличного типа
10 ноя 14, 12:54    [16821852]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Glory
Member

Откуда:
Сообщений: 104760
igor888
Вопрос: как в теле хранимой процедуры определить пуста ли табличная переменная или имеет данные?

Так же, как и для всех других таблиц - посчитать число записей
10 ноя 14, 12:54    [16821861]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
igor888
Guest
Glory,

SELECT COUNT(*)...?

спасибо)))
10 ноя 14, 12:57    [16821885]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Glory
Member

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

SELECT COUNT(*)...?

спасибо)))

Есть еще EXISTS()
10 ноя 14, 12:58    [16821897]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
igor888
Guest
Konst_One,

пишу быстро...))) чуть путая определения.
Да, табличный тип... и табличный параметр
10 ноя 14, 12:58    [16821905]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
igor888
Guest
Glory,

а что производительней? порекомендуй... хотя наверное одинаково
10 ноя 14, 12:59    [16821919]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
посмотрите план запроса, но обычно EXISTS лучше всего использовать
10 ноя 14, 13:01    [16821930]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
igor888
Guest
Konst_One,

спасибо
10 ноя 14, 13:06    [16821987]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Владислав Колосов
Member

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

CREATE TYPE - это не табличная переменная, это тип данных. Не усложняйте себе жизнь объявление пользовательских типов, мой совет.
10 ноя 14, 13:26    [16822108]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
igor888,

Табличные переменные параметры почти ничем не отличаются от обычных табличных переменных.
И как уже сказали - проверяйте экзистом, если на наличие. Т.к. каунт должен вам посчитать все.

Представьте себе эффективность разности каунта и экзиста: вы приходите на бал, и вы мужчина, вам надо узнать, будут ли с вами танцевать женщины.

Минуем неопределенный предикат сексуальности вас как индивида. Прикинем что вы совершенный.

Теперь вопрос, есть ли для вас разница, будут ли девушки на балу? Это екзистс. Или сколько девушек будет не балу? Это каунт. Разные цели, разные стратегии достичь их. Подумайте, вы же действовали бы по разному, чтобы узнать это. Так и сиквел. В терминах производительности - ВСЕГДА лучше спрашивать exists чем count.

Можно прийти в итоге к разному плану (и вы придете если используете разные конструкции), но это exists это ОБЫЫЧНО (не всегда) лучше, т.к. дает оптимизатору больше пространства для оптимизации.
10 ноя 14, 13:51    [16822253]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
SomewhereSomehow,

Я не уверен, что был достаточно ясен. Короче, вреди прочих равных, для определения строк в таблице, используйте exists, не сомневайтесь.
10 ноя 14, 13:54    [16822284]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
igor888
Guest
Konst_One
посмотрите план запроса, но обычно EXISTS лучше всего использовать


Месенький вопрос,

что будет производительный?
EXISTS(SELECT TOP 1 * FROM ....)
или
EXISTS(SELECT * FROM ....) ?
10 ноя 14, 15:36    [16823043]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
планы сравните
10 ноя 14, 15:37    [16823064]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
igor888
Konst_One
посмотрите план запроса, но обычно EXISTS лучше всего использовать


Месенький вопрос,

что будет производительный?
EXISTS(SELECT TOP 1 * FROM ....)
или
EXISTS(SELECT * FROM ....) ?


вообще то, это разные запросы.
10 ноя 14, 15:38    [16823080]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
igor888
Guest
Konst_One,

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

Вопрос в том, что имеет ли значение в этом случает "TOP 1", например запрос возвращает 1000 записей, количество строк имеет значение для EXISTS или нет. Если имеет то логичнее ставить приставку "TOP 1" для уменьшения нагрузки
10 ноя 14, 15:44    [16823147]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
top без order by не имеет смысла (или у вас там ещё where?) , запросы разные.
анализировать надо все запросы, которые вы делаете
10 ноя 14, 15:46    [16823162]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
igor888
Konst_One,

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

Вопрос в том, что имеет ли значение в этом случает "TOP 1", например запрос возвращает 1000 записей, количество строк имеет значение для EXISTS или нет. Если имеет то логичнее ставить приставку "TOP 1" для уменьшения нагрузки


в вашем случае достаточно exists(select * from @ArrayInt)
10 ноя 14, 15:47    [16823171]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
igor888
Guest
Konst_One,

Вообще то TOP 1 вернёт одну запись... иначе все
или я ошибаюсь?
10 ноя 14, 15:48    [16823178]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Glory
Member

Откуда:
Сообщений: 104760
igor888
Вообще то TOP 1 вернёт одну запись... иначе все
или я ошибаюсь?

Глубоко.
Вы читаете хелп прежде, чем делать какие-то заключения ?
10 ноя 14, 15:54    [16823252]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
aleks2
Guest
igor888
Konst_One,

Вообще то TOP 1 вернёт одну запись... иначе все
или я ошибаюсь?


для

exists( select <пофиг, что указано в списке> from ... )


и это документировано.
10 ноя 14, 15:54    [16823254]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
[quot aleks2]
igor888
Konst_One,

exists( select <пофиг, что указано в списке> from ... )


и это документировано.


ну да конечно особенно если это * WITH SCHEMABINDING
10 ноя 14, 18:44    [16824523]     Ответить | Цитировать Сообщить модератору
 Re: Небольшой вопрос про табличные переменные.  [new]
o-o
Guest
Lepsik,
по второму кругу всем уж и спорить лень
Помогите с запросом новичку...
10 ноя 14, 18:55    [16824562]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить