По какой-то причине я не могу получить синтаксис для этой хранимой процедуры. У меня есть 2 переменные. Проблема заключается в следующем: когда мы выполняем хранимую процедуру, пользователю может потребоваться указать 1 целое число для параметра, нескольких или ни одного. Я хочу разрешить все параметры пользователю в этой процедуре для обоих параметров. Ниже есть то, что у меня есть, на данный момент. Я продолжаю пробовать разные методы, и кажется, что это должно быть просто решить.ЕСЛИ ЕСЛИ В хранимой процедуре - проблема синтаксиса?
Прямо сейчас, похоже, это не похоже на ELSE. Я получил неправильный синтаксис рядом с словом «ELSE». Когда я их вынимаю, я получаю окна результатов для всех 4 запросов, хотя только один из этих IFs может быть правдой.
Может ли кто-нибудь помочь?
ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB
@BID VARCHAR = NULL, @LID VARCHAR = NULL
AS
BEGIN
SET NOCOUNT ON
--DECLARE @BID VARCHAR
--, @LID VARCHAR
--SET @BID = '301,316,373,322,331'
----'301,316,373,322,331'
--SET @LID = '1'
----'1,2,3,4'
IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') = ''
PRINT 'BOTH NULL'
BEGIN
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
END
ELSE
IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') <> ''
PRINT 'LID NULL'
BEGIN
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
WHERE VWPD.LID IN (@LID)
END
ELSE
IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = ''
PRINT 'BID NULL'
BEGIN
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
WHERE VWPD.BID IN (@BID)
END
ELSE
--IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> ''
PRINT 'NEITHER NULL'
BEGIN
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
WHERE VWPD.LID IN (@LID) AND VWPD.BID IN (@BID)
END
END
GO
--EXEC sp_ProjectDocs_AuditDB_ByLB '301','1'
GO
обновленный SQL, как работа по вопросам. Кажется, это работает, но я не получаю никаких результатов, когда могу проверить, что делаю, передавая одни и те же параметры непосредственно в представление в операторах select.
ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB
@BID VARCHAR = NULL, @LID VARCHAR = NULL
AS
BEGIN
SET NOCOUNT ON
--DECLARE @BID VARCHAR(100)
--, @LID VARCHAR
--SET @BID = '301,316,373,322,331'
----'301,316,373,322,331'
--SET @LID = '1'
----'1,2,3,4'
IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') = ''
BEGIN
--PRINT 'BOTH NULL'
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
END
ELSE
IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') <> ''
BEGIN
--PRINT 'BID NULL'
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
WHERE VWPD.LID IN (@LID)
END
ELSE
IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = ''
BEGIN
--PRINT 'LID NULL'
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
WHERE VWPD.BID IN (@BID)
END
ELSE
--IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> ''
BEGIN
--PRINT 'NEITHER NULL'
SELECT VWPD.*
FROM vw_ProjectDocs_AuditDB VWPD
WHERE VWPD.BID IN (@BID) AND VWPD.LID IN (@LID)
END
END
GO
--EXEC sp_ProjectDocs_AuditDB_ByLB '301','1'
GO
Помимо логических ошибок, вы должны рассмотреть возможность переименования вашей процедуры. Префикс sp_ может вызвать некоторые проблемы с производительностью. Либо измените префикс, либо мое предпочтение - просто полностью отбросить префикс. http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –
Я заметил здесь несколько других потенциальных проблем. Вы прошли в varchars, но не указали размер. Это означает, что они будут по умолчанию 30. Обычно лучше всего быть явным. Большая проблема, хотя вы используете эти значения varchar с предикатом IN. Если вы передаете несколько значений, которые не будут работать. Кроме того, у вас есть потенциальная проблема с производительностью с этой процедурой, потому что план выполнения может легко запутаться, когда результирующий запрос изменит каждое выполнение. http://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/ fwiw, я не был тем, кто отказался от вас –
Спасибо, Шон! Этот varchar по умолчанию был частью моей проблемы. Теперь мне просто нужно определить, передаю ли я более 1 числа для параметра, поэтому я могу передать его как многостраничный список в предложение IN where. хм .... У меня есть идея! – missscripty