Использовать значение из текстового поля в доступе к хранимой процедуре на сервере sql - PullRequest
0 голосов
/ 18 июня 2020

Я надеюсь, что кто-нибудь может помочь мне решить эту проблему.

Я использую Access в качестве клиентской системы со связанными таблицами с SQL Server Management Studio, используя ODB C. Это замедлило работу базы данных, поэтому я пытаюсь преобразовать запросы Access в хранимые процедуры в SSMS, а затем запустить их как сквозные запросы в Access. Пока это работает отлично, и запросы, которые я преобразовал, выполняются очень быстро.

Однако я преобразовал только те запросы, которые не требуют выбранных пользователем переменных в Access. Это те, с которыми у меня сейчас возникают проблемы.

Например, скажем, у меня есть простая таблица в SSMS с именем [Names], состоящая из [First Name], [Surname]

Я могу запустить следующую хранимую процедуру с именем [Search], чтобы вернуть все имена:

SELECT [First name], [Surname]
FROM [Names]

Я могу выполнить эту хранимую процедуру во внешнем интерфейсе Access как сквозной запрос, и она вернет все записей.

Однако в базе данных внешнего интерфейса Access у меня есть форма под названием [Search] с текстовым полем с именем «SearchFirstName». Когда пользователь вручную вводит «Энтони» в текстовое поле, я хотел бы, чтобы он взял значение из текстового поля и использовал его как часть хранимой процедуры для ограничения результатов следующим образом:

SELECT [First name], [Surname]
FROM [Names]
WHERE [First Name] = [Forms]![Search]![SearchFirstName]
* 1016 • Я искал помощи, но застрял. Я думаю, мне нужен Access, чтобы установить значение текстового поля в качестве параметра, который затем можно использовать в SSMS.

Путь, который я нашел, который может работать из другой статьи, приведен ниже, однако я не уверен, как / где мне нужно было бы это реализовать:

With CurrentDb.QueryDefs("qPass") .SQL = "exec SalesGeneralSearch " & strSearch Set Me.MyListBox.RowSource = .OpenRecordset End If

Если бы кто-нибудь мог помочь, я был бы очень благодарен

Спасибо

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

Вы можете использовать это:

Dim strName   as string
dim rst    as DAO.RecordSet
strName = [Forms]![Search]![SearchFirstName]
strSQL = "SELECT [First name], [Surname] FROM [Names] WHERE SurName = '" & strName & "'"

CurrentDb.QueryDefs("MyPTQuery").SQL = strSQL

'теперь открыть отчет на основе вышеизложенного.

Или для повторного набора go:

dim rst    as DAO.RecordSet
set rst = CurrentDB.OpenRecordset("MyPTQuery")
0 голосов
/ 24 июня 2020

Небольшое обновление моего исходного вопроса. Используя помощь отсюда, мне удалось заставить запрос работать для одной переменной. Это работает следующим образом:

SQL Хранимая процедура:

ALTER PROCEDURE [dbo].[ZSearch]

@First varchar(100)

AS
BEGIN

SELECT [First name], [Surname]
FROM [Names]
Where  ([First Name] LIKE '%' + @First + '%')
END

Затем в Access у меня есть сквозной запрос, который:

exec [ZSearch]

Затем, наконец, в моей форме у меня есть кнопка, которая запускает следующий VB при нажатии:

Private Sub Command4_Click()
Dim rst As DAO.Recordset

Dim First As String

First = [Forms]![Search]![SearchFirstName]

   
With CurrentDb.QueryDefs("qryPassR")
    .SQL = "exec ZSearch " & First
'Debug.Print .SQL
    Set rst = .OpenRecordset()
    DoCmd.OpenQuery "qryPassR"
End With
End Sub

Как я уже сказал, это действительно работает хорошо. Он дает результаты, которых я тоже хочу. Однако я бы также хотел добавить дополнительные поисковые переменные, например ФАМИЛИЯ. Мне также нужно, чтобы он работал, если бы какое-либо из текстовых полей в Access было пустым или каким-то образом установило значение по умолчанию для подстановочного знака.

Я пробовал следующее

SQL Хранимая процедура

ALTER PROCEDURE [dbo].[ZSearch]

@First varchar(100),
@Second varchar(100)

AS
BEGIN

SELECT [First name], [Surname]
FROM [Names]
Where  ([First Name] LIKE '%' + @First + '%') and ([Surname] LIKE '%' + @Second + '%')
END

Затем в Access у меня есть сквозной запрос:

exec [ZSearch]

Затем, наконец, в моей форме у меня есть кнопка, которая запускает следующий VB при щелчке:

Private Sub Command4_Click()
Dim rst As DAO.Recordset

Dim First As String

First = [Forms]![Search]![SearchFirstName]
Second = [Forms]![Search]![SearchSurname]

   
With CurrentDb.QueryDefs("qryPassR")
    .SQL = "exec ZSearch " & First & Second
'Debug.Print .SQL
    Set rst = .OpenRecordset()
    DoCmd.OpenQuery "qryPassR"
End With
End Sub

Однако, когда я пытаюсь добавить вторую переменную, она не работает, и отладчик vba сообщает «Ошибка компиляции» '

Я надеюсь, что это что-то простое, что я делаю неправильно

0 голосов
/ 18 июня 2020

Вот как я выполняю SQL хранимые процедуры в MS Access (VBA):

'ADODB connection (to SQL Server).
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
With cnn
    .ConnectionString = {your ODBC connection to SQL Server}
    .CommandTimeout = 30 '<-- optional, but speeds up connection problems.
    .Open
End With

'ADODB command (reference to SQL stored procedure)
Dim cmd As ADODB.Command
Set cmd = New ADODB.Command
With cmd
    .ActiveConnection = cnn
    .CommandText = {your_stored_procedure_name}
    .CommandType = adCmdStoredProc
    .CommandTimeout = 0
    .Parameters.Refresh
End With

'Add your SP parameter(s)...
cmd.Parameters("@param_name").value = {your_value}

'ADODB recordset to capture your SP results.
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
With RetVal
    .CursorLocation = adUseClient
    .CursorType = adOpenForwardOnly
    .CacheSize = 1
    .LockType = adLockReadOnly
    .Open cmd
End With

'Loop through the resultset...
Do While Not rs.EOF

    'Work with your resultset here...

rs.MoveNext '<-- don't forget this!
Loop

'Cleanup.
rs.Close
Set rs = Nothing
...