У меня есть хранимая процедура, которая имеет следующий (упрощенный пример):MS SQL - РЕГИСТРИРУЙТЕСЬ только если параметр существует в хранимой процедуре
DECLARE @id int = NULL
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON ((@id IS NOT NULL) AND (t2.id = @id))
Целью этого является то, чтобы вернуть все строки, если @id не предусмотрено , else возвращает только строки, соответствующие @id.
Работает как ожидалось, если предоставляется @id. Но он не возвращает строк, поэтому @id имеет значение null.
Я подумал, может быть
INNER JOIN table t2 ON (@id IS NULL OR ((@id IS NOT NULL) AND (t2.id = @id)))
может работать, но если @id равно нулю, то, кажется, вернуть бесконечные ряды (я подождал 30 секунд, и это было в прошлом 1M ряды. (Есть только 150 строки в таблице 1)
Я читал, и большинство других примеров для этого, похоже, используют динамический SQL (чего я бы предпочел не делать) или возможность создания таблицы temp, которая кажется немного экстремальной
Какие у меня варианты? Спасибо.
Вместо этого используйте 'IF @id IS NULL'. Поэтому дайте запрос для случая, что параметр «null» и один для случая с непустым. Это намного эффективнее –
вам следует присоединиться к table1 и table2 как-то –
Попробуйте написать отдельные запросы на основе значения параметра! – Lucky