150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
1

Передача параметров из Access в ХП SQL Server

03.05.2017, 10:44. Показов 4265. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем,
подскажите как правильно передать параметры в хранимую процедуру при ее вызове из Access?
На сервере создал ХП:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
USE [ASDF]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[z_Server_Ambzab] 
@D1 datetime = null 
,@D2 datetime = null 
AS
BEGIN
    SET NOCOUNT ON;
SELECT *
FROM dbo.Ambzab;
END
В Access имеются пользовательские функции D1() и D2() (краткий формат дата и время)
Из Access вызываю ХП:
Visual Basic
1
exec z_server_ambzab
Как передать в ХП значение интервала дат Between D1() And D2() ?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2017, 10:44
Ответы с готовыми решениями:

Не хватает параметров в запросе аксесс к таблицам SQL Server
Здравствуйте. В приложении на Аксесс все таблицы привязаны с БД SQL Server. Делаю запрос на VBA:...

Ms Access + MS SQL Server
Кто работал в такой связке, подскажите пожалуйста. Если я в Access делаю связные таблицы к SQL...

ACCESS <-> MS SQL Server
Помогите, как засадить данные в ComboBox на форме в ACCESS из таблицы в MS SQL Server 2000 ? Связь...

Access & SQL Server
Ni razu ne delal, wot teper' prihoditsja... Nushno podkljuchit', k Access, bazu dannih...

23
1266 / 448 / 129
Регистрация: 21.03.2013
Сообщений: 1,210
03.05.2017, 17:32 2
Помогите ТС, мне тоже интересен ответ.

я предполагаю что процедура SQL Server должна иметь входные параметры, а я их не вижу,
тогда из аксесс вызывается эта процедура с параметрами
0
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
05.05.2017, 09:33  [ТС] 3
тогда так))

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
USE [ASDF]
GO
/****** Object:  StoredProcedure [dbo].[z_Server_Ambzab]*/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[z_Server_Ambzab] 
@DT1 datetime
,@DT2 datetime
AS
BEGIN
    SET NOCOUNT ON;
SELECT Ambzab.IDZAB, Ambzab.RegDataZ, Ambzab.KDR, Ambzab.KK, Ambzab.PRIMZ, Ambzab.REPEATEDZ, Ambzab.UMOZ, Ambzab.KZ, Ambzab.SLUCHTRUDZ, Ambzab.DNITRUDZ, Ambzab.KONSZ
FROM Ambzab
WHERE Ambzab.RegDataZ Between @DT1 And @DT2;
END
Добавлено через 18 минут
ошибка, надо так: ))
T-SQL
1
WHERE (((Ambzab.RegDataZ) Between @DT1 And @DT2));
Добавлено через 9 минут
если в запросе к серверу указываю
SQL
1
2
3
EXEC z_server_ambzab 
@DT1 = 'D1()'
,@DT2 = 'D2()'
выходит сообщение: Ошибка при преобразовании типа данных varchar к datetime.(#8114)
Подскажите как это исправить?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
05.05.2017, 09:40 4
Цитата Сообщение от rvg Посмотреть сообщение
Подскажите как это исправить?
ну уж во всяком случае не строки странного вида передавать в качестве даты
ну во как сервер должен перевести в дату 'D1()'. Какое это число по-вашему?
для начала попробуйте с константами типа
SQL
1
EXEC z_server_ambzab @DT1 = '20170101', @DT2 = '20170131'
0
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
05.05.2017, 10:10  [ТС] 5
D1() и D2() это функции, они имеют конкретные значения, в простой разделенной базе все работает, Требуется передать их значения входным параметрам ХП

Добавлено через 1 минуту
Цитата Сообщение от YuryK Посмотреть сообщение
1
EXEC z_server_ambzab @DT1 = '20170101', @DT2 = '20170131'
в таком виде все работает ))

Добавлено через 5 минут
т.е., как мне думается, формат ' 01012017' надо как-то привести к виду '20170101'?

Добавлено через 1 минуту
D1() и D2() имеют краткий формат дата и время
0
1266 / 448 / 129
Регистрация: 21.03.2013
Сообщений: 1,210
05.05.2017, 10:18 6
Цитата Сообщение от YuryK Посмотреть сообщение
EXEC z_server_ambzab @DT1 = '20170101', @DT2 = '20170131'
даты sql server имеют формат yyyymmdd
тогда
SQL
1
EXEC z_server_ambzab @DT1 = format(D1(),"\'yyyymmdd\'"), @DT2 = format(D2(),"\'yyyymmdd\'")
0
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
05.05.2017, 10:28  [ТС] 7
ругается на неправильный синтаксис у конструкции D1, никак не догоню, чего надо (
0
1266 / 448 / 129
Регистрация: 21.03.2013
Сообщений: 1,210
05.05.2017, 10:34 8
попробуй так или поиграйся с кавычкой, дата в скуле обрамляется одинарной кавычкой, по моему
SQL
1
EXEC z_server_ambzab format(D1(),"\'yyyymmdd\'"), format(D2(),"\'yyyymmdd\'")
Добавлено через 3 минуты
Цитата Сообщение от boby104 Посмотреть сообщение
z_server_ambzab
когда набираешь в аксессе эту функцию, посказка всплывает о необходимости передачи параметров?
0
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
05.05.2017, 11:06  [ТС] 9
нет, только сообщение от сервера о неправильном синтаксисе

Добавлено через 25 минут
если в таком виде
EXEC z_server_ambzab

то сообщение от сервера: Процедура или функция "z_Server_Ambzab" ожидает параметр "@DT1", который не был указан. (#201)
0
1266 / 448 / 129
Регистрация: 21.03.2013
Сообщений: 1,210
05.05.2017, 12:20 10
Цитата Сообщение от rvg Посмотреть сообщение
нет, только сообщение от сервера о неправильном синтаксисе
мое предположение? что в запрос попадает дата, которая не воспринимается как дата (без кавычек или с кавычками но не как дата)
я не сильный знаток - но предлагаю:
формировать запрос как строку отдельно, тоже переменной.
а в функции уже запускать запрос на исполнение
Там есть команда в скуле запустить запрос на выполнение с параметром срока запроса
Этот нижеуказанный запрос нужно формировать отдельно строкой, где переменные @DT1 And @DT2 будут в формате 'yyyymmdd'

Цитата Сообщение от rvg Посмотреть сообщение
SELECT Ambzab.IDZAB, Ambzab.RegDataZ, Ambzab.KDR, Ambzab.KK, Ambzab.PRIMZ, Ambzab.REPEATEDZ, Ambzab.UMOZ, Ambzab.KZ, Ambzab.SLUCHTRUDZ, Ambzab.DNITRUDZ, Ambzab.KONSZ FROM Ambzab WHERE Ambzab.RegDataZ Between @DT1 And @DT2;
Добавлено через 3 минуты
Цитата Сообщение от rvg Посмотреть сообщение
то сообщение от сервера: Процедура или функция "z_Server_Ambzab" ожидает параметр "@DT1", который не был указан. (#201)
Это уже хорошо. значит если мы указываем значения переменной то они передаются из аксесса в скуль, но не как дата
0
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
05.05.2017, 12:24  [ТС] 11
чет мне кажется от перемены мест результат не изменится(, все равно значения надо передать параметрам, которые должны принять правильное значение.
0
1266 / 448 / 129
Регистрация: 21.03.2013
Сообщений: 1,210
05.05.2017, 12:44 12
Цитата Сообщение от rvg Посмотреть сообщение
все равно значения надо передать параметрам, которые должны принять правильное значение
команда EXEC ПеременнаяСодержащаяТекстЗапроса
Запрос формируется строкой в двойных кавычках а значения переменных даты в одинарной кавычки, просто под рукой нет моего примера, где я с похожим колупался.
0
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
05.05.2017, 13:29  [ТС] 13
Цитата Сообщение от boby104 Посмотреть сообщение
под рукой нет моего примера
да, примерчик в данном случае мне бы не помешал...)))
0
шапоклякистка 8-го дня
3678 / 2238 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.05.2017, 08:53 14
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Function srvRunStored(strStoredName As String, strSchemaName As String, ParamArray varInput() As Variant)
' Выполнить хранимую процедуру с параметрами
Dim cmd As ADODB.Command
Dim i As Integer, L As Integer, N As Integer
On Error GoTo ErrHandler
    ' Команда
    Set cmd = New ADODB.Command
    cmd.CommandText = strStoredName
    cmd.CommandType = adCmdStoredProc
    cmd.ActiveConnection = allConnString(255) ' cnx
    cmd.Parameters.Refresh
    L = LBound(varInput)
    N = UBound(varInput) - L + 1
    If N > cmd.Parameters.Count - 1 Then N = cmd.Parameters.Count - 1
    For i = 1 To N
        ' Debug.Print cmd.Parameters(i).name, varInput(L + i - 1)
        cmd.Parameters(i) = varInput(L + i - 1)
    Next i
    If strSchemaName > "" Then cmd.CommandText = strSchemaName & "." & strStoredName
    cmd.Execute
NormalExit:
    srvRunStored = cmd.State
    Set cmd = Nothing
    Exit Function
ErrHandler:
Dim errCmd
    For Each errCmd In cmd.ActiveConnection.Errors
        Debug.Print Err.Number, Err.Description
    Next errCmd
    srvRunStored = 0
    Resume NormalExit
End Function
2
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
06.05.2017, 19:27  [ТС] 15
texnik-san, стесняюсь спросить, как с помощью этой функции присвоить параметрам хранимой процедуры значения функций D1() и D2() из Access? В целом мне надо отфильтровать записи таблицы по интервалу дат на стороне сервера, чтобы в дальнейшем использовать результат для дальнейшей обработки в Access. Это первый запрос на который будут в дальнейшем ссылаться другие запросы в Access.
0
шапоклякистка 8-го дня
3678 / 2238 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
06.05.2017, 19:48 16
Лучший ответ Сообщение было отмечено rvg как решение

Решение

Цитата Сообщение от rvg Посмотреть сообщение
отфильтровать записи таблицы по интервалу дат на стороне сервера, чтобы в дальнейшем использовать результат
Ну извините, по вашему изначальному вопросу я никак не могла догадаться, что процедура у вас на выборку, а не исполнимая. Формулируйте вопросы точнее - не будете получать ответы не на тот вопрос.

Тогда вам нужно просто программно сгенерить полный текст вызова функции вместе с результатом работы ваших функций (т.е. должны попасть уже готовые константы, а не переменные), и присвоить получившийся текст свойству .sql заранее созданного запроса к серверу. А затем этим запросом можно пользоваться как обычным аксесным.

Visual Basic
1
2
3
dim str as string
str = "EXEC z_server_ambzab @DT1 = '" & Format(D1(),"YYYYMMDD") & "', @DT2 = '" & Format(D2(),"YYYYMMDD") & "'"
currentdb.querydefs("ИмяЗапросаКСерверу").sql = str
1
150 / 28 / 3
Регистрация: 24.08.2014
Сообщений: 485
07.05.2017, 08:15  [ТС] 17
texnik-san, извините за бестолковость, но не могли бы Вы объяснить более конкретно?
На сервере (SQL Server Express 2014) создал хранимую процедуру, при запуске говорит, что выполнение команд успешно завершено:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
USE [ASDF]
GO
/****** Object:  StoredProcedure [dbo].[z_server_ambzab]    Script Date: 07.05.2017 7:39:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[z_server_ambzab] 
    -- Add the parameters for the stored procedure here
    @DT1 datetime, 
    @DT2 datetime
AS
BEGIN
 
    SET NOCOUNT ON;
 
SELECT Ambzab.IDZAB, Ambzab.RegDataZ, Ambzab.KDR, Ambzab.KK, Ambzab.PRIMZ, Ambzab.REPEATEDZ, Ambzab.UMOZ, Ambzab.KZ, Ambzab.SLUCHTRUDZ, Ambzab.DNITRUDZ, Ambzab.KONSZ
FROM Ambzab
WHERE (((Ambzab.RegDataZ) Between @DT1 And @DT2));
END
Что мне надо указать в запросе к серверу и на какое событие лучше повесить приведенный Вами код?
0
шапоклякистка 8-го дня
3678 / 2238 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
07.05.2017, 09:28 18
Цитата Сообщение от rvg Посмотреть сообщение
Что мне надо указать в запросе к серверу
Скажем, ту форму вызова процедуры, которая у вас заведомо работает:
EXEC z_server_ambzab @DT1 = '20170101', @DT2 = '20170131'
Все равно этот текст потом программно будет изменен - будут заданы другие константы. Важен сам факт, что запрос к серверу уже создан и в нем прописаны свойства соединения с сервером - т.е. их не надо каждый раз заново перепрописывать программно. Упрощает

Цитата Сообщение от rvg Посмотреть сообщение
на какое событие лучше повесить приведенный Вами код
Где-то между тем, как получат свои значения начальная и конечная даты и тем, как вам будет уже нужен результат выборки с сервра. А точнее я не смогу вам подсказать, т.к. понятия не имею, какие вообще объекты и события есть в вашей базе.

Скажем, если даты вводит пользователь, нажимает кнопку, а выборка нужна в форме, которая будет открыта по нажатию пользователем кнопки - логично повесить это на нажатие кнопки.
1
шапоклякистка 8-го дня
3678 / 2238 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
07.05.2017, 09:46 19
На всякий случай: под "запросом к серверу" я имею в виду запрос, созданный в Аксес, но особого типа (он таки назвается "Запрос к серверу". В нем в свойствах прописываются данные подключения к серверу, и такой запрос выполняется сервером , но в аксес его можно использовать так же, как и любой другой запрос.
Миниатюры
Передача параметров из Access в ХП SQL Server  
0
шапоклякистка 8-го дня
3678 / 2238 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
07.05.2017, 10:23 20
Прошу прощения за опечатку:

так и называется
0
07.05.2017, 10:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2017, 10:23
Помогаю со студенческими работами здесь

Перемещение из access в SQL server
Добрый день. Нужно постоянно перемещать данные из таблицы аксес в таблицу SQL server, для этого...

Люди памагите! Sql server и Access
На сервере у меня есть БД, я через ODBC подключил ее в аксес. Есть формы и все такое. У меня...

Перенос базы Access в SQL Server
начало здесь https://www.cyberforum.ru/ms-access/thread87179-page2.html Сергей1980, ты как я...

Ускорение работы Access-SQL Server
Сабж такой: Имеется некий апгрейд клиент-серверной БД Access-Access на Access-SQL Server следующим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru