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

Ближе к делу: имеется таблица транзакций WMS (содержит данные кто,что,как,через ково,... когда делал), размер достаточно большой. И к сожалению только по этой таблице имеется возможность предоставить данные по транзакциям действий.

Вопрос в следующем: к примеру запрос обернут в хранимку и имеет некоторые входные параметры, особую роль в моем вопросе играют 2 параметра

@sku nvarchar(10) -- (код номенклатуры) 
@loc nvarchar(15)(ячейка складирования)


Посколько цель заключается в создании одного отчета по двум режимам: Транзакции по номенклатуре и транзакции по ячейке указанно за некий период. Так вот, оба эти параметра могут принимать значение 'NULL', и если пользователь не ввел данные хотябы в один из них, то мне необходимо было вывести пустую таблицу, т.е. отклонить выполнение запроса м хранимке. сделал это так, через ветвление:

IF ((@sku is not null) OR (@loc is not null))
select pole1,pole2,..poleN from ... where ...
ELSE 
select '' pole1,''pole2,...poleN


без ELSE среда ECLIPSE не видет колонки в DATASOURCE, в принцепе по чему я прекрасно понимаю, но с ним ругается на типы данных, тут тоже все понятно.

И вот сам вопрос: Я вышел из ситуации следующим образом, результат выполнения запроса записываю в заранее объявленную временную таблицу, и если оба параметра имеют значения неопределенности, то тупо вывожу пустую таблицу (типы данных идентичны). все работает, но не нравится мне использовать временную таблицу там где она явно не нужна.

Можно ли как то организовать условие в запросе на заполненность двух параметров, типо такого:

DECLARE @T TABLE (ID INT, LOC VARCHAR(10), SKU VARCHAR(10))
DECLARE @LOC VARCHAR(10), @SKU VARCHAR(10)
SET @LOC = NULL
SET @SKU = NULL


INSERT INTO @T SELECT 1,'111','2222'
INSERT INTO @T SELECT 1,NULL,'3333'
INSERT INTO @T SELECT 1,'444',NULL

--1
SELECT * FROM @T

--2
SELECT * FROM @T
WHERE ((@LOC IS NOT NULL) OR (@SKU IS NOT NULL))


при выполнении второго запроса все равно происходит скан таблицы, как то можно избежать этого и просто вернуть пустой результат (но с соответствием запрашиваемых колонок)

ну как то так, изложил как смог =), всем заранее огромное спасибо за помощь!
22 сен 15, 18:22    [18181964]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возрат пустой таблице  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2566
СТУДЕНТ123,

select pole1,pole2,..poleN from ... where ... AND
1 = CASE WHEN ((@sku is not null) OR (@loc is not null)) THEN 1 ELSE 0 END
?
22 сен 15, 18:29    [18181990]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возрат пустой таблице  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
select pole1,pole2,..poleN from ... where (@sku is not null or @loc is not null) and ...

Или разбить на два запроса с union all. Зависит от того, что в from и where.
22 сен 15, 18:29    [18181991]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возрат пустой таблице  [new]
_djХомяГ
Guest
можно "безобразно" с goto
DECLARE @T TABLE (ID INT, LOC VARCHAR(10), SKU VARCHAR(10))
DECLARE @LOC VARCHAR(10), @SKU VARCHAR(10)
SET @LOC = NULL
SET @SKU = NULL

if @loc is NULL and @SKU is NULL
  goto FINISH

INSERT INTO @T SELECT 1,'111','2222'
INSERT INTO @T SELECT 1,NULL,'3333'
INSERT INTO @T SELECT 1,'444',NULL

FINISH:
SELECT * FROM @T
22 сен 15, 18:33    [18181998]     Ответить | Цитировать Сообщить модератору
 Re: Процедура возрат пустой таблице  [new]
СТУДЕНТ123
Guest
Класс! спасибо, а про CASE совсем забыл, что то вообще загнался, ведь строка возвращается только одна
в любом варианте что с case что без него (проверка на NULL).
Такое часто происходит, пока баян настрочишь и тут то вся теория вспоминается.

Всем СПАСИБО огрменной, за поддержку!
22 сен 15, 18:37    [18182010]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить