#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 в целом.