Добрый день всем знатокам и повелителям VBA , подскажите как такой запрос заставить запускаться , перечитал много всего, у меня SQL server / MS 2010 , через ADO, Пришло понимание что только через Объект Command и CreateParameter , но что то у меня не выходит ((((((( [vba]
Добрый день всем знатокам и повелителям VBA , подскажите как такой запрос заставить запускаться , перечитал много всего, у меня SQL server / MS 2010 , через ADO, Пришло понимание что только через Объект Command и CreateParameter , но что то у меня не выходит ((((((( [vba]
Доброе время суток. А с чего вы решили, что приведённый вами код - хранимая процедура? Обычный код, собираемый из строк, вот и подставляейте значение ячейки вместо 4362. И по Set rs = Conn.Execute "Здесь текст SQL команды, возвращающей в конце по SELECT @AfsMessage" значение ответа реальной хранимой процедуры sp_AfsSOAP_Request. Каша у вас в коде, к сожалению. Посмотрите описание и примеры работы.
Доброе время суток. А с чего вы решили, что приведённый вами код - хранимая процедура? Обычный код, собираемый из строк, вот и подставляейте значение ячейки вместо 4362. И по Set rs = Conn.Execute "Здесь текст SQL команды, возвращающей в конце по SELECT @AfsMessage" значение ответа реальной хранимой процедуры sp_AfsSOAP_Request. Каша у вас в коде, к сожалению. Посмотрите описание и примеры работы.anvg
Сообщение отредактировал anvg - Среда, 08.02.2017, 09:18
anvg, Доброго, я согласен что каша просто я в SQL ещё больший профан ... , а на счёт запроса который выше описан , рекордсет не может читать запрос если в нём и запрос и хранимая процедура , то есть как я понял только либо простым запросом либо одной хранимкой .. буду думать
anvg, Доброго, я согласен что каша просто я в SQL ещё больший профан ... , а на счёт запроса который выше описан , рекордсет не может читать запрос если в нём и запрос и хранимая процедура , то есть как я понял только либо простым запросом либо одной хранимкой .. буду думатьElhust
Упрощённо. В базе есть хранимая процедура, созданная как [vba]
Код
Create Procedure dbo.MyProcedure @Where int, @Result nvarchar(max) Output As Begin -- здесь ваш код ХП End;
[/vba]
В VBA при явно подключенной библиотеке ADODB код [vba]
Код
Public Sub test() Dim rs As New ADODB.Recordset, conn As New ADODB.Connection, pCom As ADODB.Command Dim whereId As Long conn.Open "Connection string settings"
'Получаем значение параметра для ХП запросом к таблице в базе rs.Open "Select UserId From MyDb.dbo.Users Where UserName = '" & ActiveSheet.Range("A2").Value & "';", conn whereId = rs(0).Value rs.Close
'настраиваем вызов ХП и её параметры Set pCom = New ADODB.Command Set pCom.ActiveConnection = conn pCom.Parameters.Append pCom.CreateParameter("@Where", adInteger, adParamInput, Value:=whereId) pCom.Parameters.Append pCom.CreateParameter("@Result", adVarWChar, adParamOutput, 65000) pCom.CommandType = adCmdStoredProc pCom.CommandText = "MyDb.dbo.MyProcedure" 'выполняем ХП pCom.Execute Option:=adExecuteNoRecords
Debug.Print "Результат выполнения " & pCom.Parameters("@Result").Value Set pCom = Nothing conn.Close Set conn = Nothing End Sub
[/vba]
Упрощённо. В базе есть хранимая процедура, созданная как [vba]
Код
Create Procedure dbo.MyProcedure @Where int, @Result nvarchar(max) Output As Begin -- здесь ваш код ХП End;
[/vba]
В VBA при явно подключенной библиотеке ADODB код [vba]
Код
Public Sub test() Dim rs As New ADODB.Recordset, conn As New ADODB.Connection, pCom As ADODB.Command Dim whereId As Long conn.Open "Connection string settings"
'Получаем значение параметра для ХП запросом к таблице в базе rs.Open "Select UserId From MyDb.dbo.Users Where UserName = '" & ActiveSheet.Range("A2").Value & "';", conn whereId = rs(0).Value rs.Close
'настраиваем вызов ХП и её параметры Set pCom = New ADODB.Command Set pCom.ActiveConnection = conn pCom.Parameters.Append pCom.CreateParameter("@Where", adInteger, adParamInput, Value:=whereId) pCom.Parameters.Append pCom.CreateParameter("@Result", adVarWChar, adParamOutput, 65000) pCom.CommandType = adCmdStoredProc pCom.CommandText = "MyDb.dbo.MyProcedure" 'выполняем ХП pCom.Execute Option:=adExecuteNoRecords
Debug.Print "Результат выполнения " & pCom.Parameters("@Result").Value Set pCom = Nothing conn.Close Set conn = Nothing End Sub
anvg,Большая Благодарность, разобрался и всё получилось, теперь думаю как бы засунуть в цикл , точнее засунул но на мой взгляд кастыльно получилось долго обрабатывает ( [vba]
Код
Dim Conn Dim Ary() '------------------------------------------------------------------------------------------------------------------ Sub test_conn()
'Dim Prm As ADODB.Parameter Dim cmd As ADODB.Command Dim Conn As ADODB.Connection Dim rs As ADODB.Recordset Dim lLastrow, i As Long Dim iCell As Range Dim whereID As Long '------------------------------------------------------------------------------------------------------------------ Application.ScreenUpdating = False Range("G2:G65536").Clear lLastrow = Cells(Rows.Count, 2).End(xlUp).Row i = 1 '------------------------------------------------------------------------------------------------------------------ Set Conn = New ADODB.Connection Conn.ConnectionString = "driver={SQL Server};server=177.17.3.176;uid= ;pwd= ;database=MainDWH" Conn.Open '------------------------------------------------------------------------------------------------------------------
With ThisWorkbook.Worksheets(1)
For Each iCell In .Range("B2", Cells(lLastrow, 2)) whereID = iCell.Value Set cmd = New ADODB.Command With cmd .ActiveConnection = Conn .Parameters.Append cmd.CreateParameter("@ID", adInteger, adParamInput, Value:=whereID) .CommandType = adCmdStoredProc .CommandText = "port.AFSMESS" End With Set rs = cmd.Execute() i = i + 1 Cells(i, 7).CopyFromRecordset rs Set cmd = Nothing If iCell = "" Then Cells(i, 7).Value = "" End If Next End With Application.ScreenUpdating = True '------------------------------------------------------------------------------------------------------------------ 'Conn.Close 'rs.Close 'Set rs = Nothing 'Set con = Nothing End Sub
[/vba]
anvg,Большая Благодарность, разобрался и всё получилось, теперь думаю как бы засунуть в цикл , точнее засунул но на мой взгляд кастыльно получилось долго обрабатывает ( [vba]
Код
Dim Conn Dim Ary() '------------------------------------------------------------------------------------------------------------------ Sub test_conn()
'Dim Prm As ADODB.Parameter Dim cmd As ADODB.Command Dim Conn As ADODB.Connection Dim rs As ADODB.Recordset Dim lLastrow, i As Long Dim iCell As Range Dim whereID As Long '------------------------------------------------------------------------------------------------------------------ Application.ScreenUpdating = False Range("G2:G65536").Clear lLastrow = Cells(Rows.Count, 2).End(xlUp).Row i = 1 '------------------------------------------------------------------------------------------------------------------ Set Conn = New ADODB.Connection Conn.ConnectionString = "driver={SQL Server};server=177.17.3.176;uid= ;pwd= ;database=MainDWH" Conn.Open '------------------------------------------------------------------------------------------------------------------
With ThisWorkbook.Worksheets(1)
For Each iCell In .Range("B2", Cells(lLastrow, 2)) whereID = iCell.Value Set cmd = New ADODB.Command With cmd .ActiveConnection = Conn .Parameters.Append cmd.CreateParameter("@ID", adInteger, adParamInput, Value:=whereID) .CommandType = adCmdStoredProc .CommandText = "port.AFSMESS" End With Set rs = cmd.Execute() i = i + 1 Cells(i, 7).CopyFromRecordset rs Set cmd = Nothing If iCell = "" Then Cells(i, 7).Value = "" End If Next End With Application.ScreenUpdating = True '------------------------------------------------------------------------------------------------------------------ 'Conn.Close 'rs.Close 'Set rs = Nothing 'Set con = Nothing End Sub
А чего вы собственно хотите? Нельзя больше одного значения засунуть в параметр ХП. Если у вас извлекаемые данные ХП обрабатывает из таблиц, то проще и быстрее, посмотреть, что за запрос там храниться, сделать временную таблицу со стороны VBA, залить туда данные по ID и выгрузить одним запросом с join по ID временной таблицы.
А чего вы собственно хотите? Нельзя больше одного значения засунуть в параметр ХП. Если у вас извлекаемые данные ХП обрабатывает из таблиц, то проще и быстрее, посмотреть, что за запрос там храниться, сделать временную таблицу со стороны VBA, залить туда данные по ID и выгрузить одним запросом с join по ID временной таблицы.anvg