SQL Server: ВНУТРЕННЕЕ СОЕДИНЕНИЕ с предложением WHERE не работает

#vb.net #stored-procedures #inner-join #sql-server-2014-express

#vb.net #хранимые процедуры #внутреннее соединение #sql-server-2014-express

Вопрос:

Ожидание вывода из следующего запроса;

 ALTER PROCEDURE [dbo].[ASASearchMed]
(
    @Endorsed Varchar(200),
    @Authorized Varchar(200),
    @Notes Varchar(200),
    @LastName Varchar(50),
    @FirstName Varchar(50),
    @MiddleName Varchar(50)
)
AS
  SELECT 
     ASA.ASAID
     , ASA.ProID
     , PRO.LastName
     , PRO.FirstName
     , PRO.MiddleName
     , ASA.ASAType
     , ASA.Endorsed
     , ASA.Authorized
     , ASA.Notes
     , ASA.DateReg
     , ASA.DateMod
     , ASA.UserReg
     , ASA.UserMod
  FROM
     dbo.ASA
  INNER JOIN 
     dbo.PRO ON ASA.ProID = PRO.ProID
  WHERE
     ASA.ASAType = 'Medical'
     AND NULLIF(ASA.MedGLCtrlNo, '') IS NULL OR ASA.MedGLCtrlNo = '' 
     AND (ASA.Endorsed LIKE '%'   @Endorsed   '%' OR
          ASA.Authorized LIKE '%'   @Authorized   '%' OR
          ASA.Notes LIKE '%'   @Notes   '%' OR
          PRO.LastName LIKE '%'   @LastName   '%' OR
          PRO.FirstName LIKE '%'   @FirstName   '%' OR
          PRO.MiddleName LIKE '%'   @MiddleName   '%')
  

Когда я пытаюсь запустить это, я ничего не получаю, поскольку похоже, что оно даже не выполнялось, но когда я попробовал запрос в Management Studio, проблема сохраняется.

Я пытаюсь отфильтровать поиск с помощью тех записей, которые помечены только как Medical и есть NULL или с '' пустой строкой, а также должны соответствовать данным, указанным в каждом поле ниже.

Мой код для поиска

  Public Sub Search()
        Dim StrSQL As String = "ASASearchMed"
        cLib = New clsLibrary
        cLib.openConnection(strConnection)
        If Not cLib.isConnectionOpen() Then
            Exit Sub
        End If
        cLib.initializeCommand(StrSQL)
        cLib.addParameter("@Endorsed", SqlDbType.VarChar, txtSearch.TextLength, txtSearch.Text)
        cLib.addParameter("@Authorized", SqlDbType.VarChar, txtSearch.TextLength, txtSearch.Text)
        cLib.addParameter("@Notes", SqlDbType.VarChar, txtSearch.TextLength, txtSearch.Text)
        cLib.addParameter("@LastName", SqlDbType.VarChar, txtSearch.TextLength, txtSearch.Text)
        cLib.addParameter("@FirstName", SqlDbType.VarChar, txtSearch.TextLength, txtSearch.Text)
        cLib.addParameter("@MiddleName", SqlDbType.VarChar, txtSearch.TextLength, txtSearch.Text)
        objCommand.ExecuteNonQuery()
        lview.Items.Clear()
        DisplayData()
    End Sub
  

и как я отображаю вывод в listview

     Public Sub DisplayData()
        Dim objDataReader = objCommand.ExecuteReader
        While objDataReader.Read
            Dim listview As New ListViewItem
            With listview
                .Text = objDataReader.Item("ASAID")
                .SubItems.Add(objDataReader("ProID"))
                .SubItems.Add(objDataReader("LastName"))
                .SubItems.Add(objDataReader("FirstName"))
                .SubItems.Add(objDataReader("MiddleName"))
                .SubItems.Add(objDataReader("ASAType"))
                .SubItems.Add(objDataReader("Endorsed"))
                .SubItems.Add(objDataReader("Authorized"))
                .SubItems.Add(objDataReader("Notes"))
                .SubItems.Add(objDataReader("DateReg"))
                .SubItems.Add(objDataReader("DateMod"))
                .SubItems.Add(objDataReader("UserReg"))
                .SubItems.Add(objDataReader("UserMod"))
            End With
            lview.Items.Add(listview)
        End While
    End Sub
  

.

     Public Sub LoadData()
        Dim StrSQL As String = "ASAViewMed"
        cLib = New clsLibrary
        cLib.openConnection(strConnection)
        If Not cLib.isConnectionOpen() Then
            Exit Sub
        End If
        cLib.initializeCommand(StrSQL)
        objCommand.ExecuteNonQuery()
        lview.Items.Clear()
        DisplayData()
    End Sub
  

Надеюсь, кто-нибудь может помочь или просветить меня. Заранее спасибо!

Комментарии:

1. Попробуйте удалить предложение where и посмотрите, что вы получите (используйте management studio). Затем добавьте тесты предложения where один за другим, пока не найдете виновника.

2. Привет @rontornambe, пробовал это раньше и до сих пор не могу выяснить, в чем проблема.

3. Итак, соединение без предложения where возвращает строки now?

4. @rontornambe Проблема решена. Спасибо

Ответ №1:

Попробуйте

    AND (ASA.MedGLCtrlNo IS NULL OR ASA.MedGLCtrlNo = '' )
  

проверьте группировку ( ) также в этом примере и в вашем предложении WHERE в целом.