-1

По какой-то причине я не могу получить синтаксис для этой хранимой процедуры. У меня есть 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 
+0

Помимо логических ошибок, вы должны рассмотреть возможность переименования вашей процедуры. Префикс sp_ может вызвать некоторые проблемы с производительностью. Либо измените префикс, либо мое предпочтение - просто полностью отбросить префикс. http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix –

+3

Я заметил здесь несколько других потенциальных проблем. Вы прошли в varchars, но не указали размер. Это означает, что они будут по умолчанию 30. Обычно лучше всего быть явным. Большая проблема, хотя вы используете эти значения varchar с предикатом IN. Если вы передаете несколько значений, которые не будут работать. Кроме того, у вас есть потенциальная проблема с производительностью с этой процедурой, потому что план выполнения может легко запутаться, когда результирующий запрос изменит каждое выполнение. http://sqlinthewild.co.za/index.php/2009/09/15/multiple-execution-paths/ fwiw, я не был тем, кто отказался от вас –

+0

Спасибо, Шон! Этот varchar по умолчанию был частью моей проблемы. Теперь мне просто нужно определить, передаю ли я более 1 числа для параметра, поэтому я могу передать его как многостраничный список в предложение IN where. хм .... У меня есть идея! – missscripty

ответ

2

Попробуйте это, Вы должны дать Print заявление внутри Begin-End блока.

ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB 
@BID VARCHAR = NULL, @LID VARCHAR = NULL 
AS 
BEGIN 
    declare @sqlquery varchar(max) 

    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,'') = '' 

     BEGIN 
     set @sqlquery = ' 
     PRINT ''BOTH NULL'' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD' 
     END 
    ELSE 
     IF ISNULL(@BID,'') = '' AND ISNULL(@LID,'') <> '' 

      BEGIN 
      set @sqlquery = ' 
      PRINT ''LID NULL'' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.LID IN(' + @LID+')' 
      END 
    ELSE   
     IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = '' 

      BEGIN 
      set @sqlquery = ' 
      PRINT ''BID NULL'' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.BID IN ('+ @BID+')' 
      END 
    ELSE 
    --IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> '' 

     BEGIN 
     set @sqlquery = ' 
     PRINT ''NEITHER NULL'' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
      WHERE VWPD.LID IN ('[email protected]+') AND VWPD.BID IN ('[email protected]+')' 

     END 
    EXEC (@sqlquery) 
END 
GO 
+0

это заставляет меня передавать ошибки else, но теперь я не получаю никаких результатов, с сообщением, в котором сообщается мне правильный «ни пустой». Я могу запросить представление напрямую, с параметрами, которые я тестировал (bid = 301, lid = 1), и я получаю 10 результатов (что я должен). но выполнение из хранимой процедуры, я получаю 0 результатов. Есть предположения? – missscripty

+0

Можете ли вы заменить PRINT на SELECT и повторите попытку – DineshDB

+0

Вы имеете в виду раньше или PRINT SELECT ....? – missscripty

3

Вы должны поставить PRINT внутри BEGIN/END блока.

Обратите внимание, что сообщения 'LID NULL' и 'BID NULL' указаны неверно на основе вашего IF.

1

Вот заключительная, работающая хранимая процедура.

ALTER PROCEDURE sp_ProjectDocs_AuditDB_ByLB 
@BID NVARCHAR(500) = NULL, @LID NVARCHAR(500) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON 

    --DECLARE @BID NVARCHAR(500) 
    --, @LID NVARCHAR(500) 
    --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 (SELECT * FROM SPLIT(@LID, ',')) 
      END 
    ELSE   
     IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') = '' 
      BEGIN 
       --PRINT 'LID NULL' 
       SELECT VWPD.* 
       FROM vw_ProjectDocs_AuditDB VWPD 
       WHERE VWPD.BID IN (SELECT * FROM SPLIT(@BID, ',')) 
      END 
    ELSE 
    --IF ISNULL(@BID,'') <> '' AND ISNULL(@LID,'') <> '' 
     BEGIN 
      --PRINT 'NEITHER NULL' 
      SELECT VWPD.* 
      FROM vw_ProjectDocs_AuditDB VWPD 
      WHERE VWPD.BID IN (SELECT * FROM SPLIT(@BID, ',')) AND VWPD.LID IN (SELECT * FROM SPLIT(@LID, ',')) 

     END 
END 
GO 

--EXEC sp_ProjectDocs_AuditDB_ByLB '301','1' 

GO 
Смежные вопросы