powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вывод данных из хранимой процедуры
28 сообщений из 28, показаны все 2 страниц
Вывод данных из хранимой процедуры
    #39838056
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Уже второй день бьюсь об стену непонимания. Есть хранимая процедура, которая возвращает таблицу:
Код: sql
1.
2.
3.
4.
5.
6.
ALTER procedure [dbo].[upPrice] (@id int, @newPrice int) AS
SET NOCOUNT ON;
/* Тут происходят какие то манипуляции с данными и в результате получаем таблицу*/
 
SELECT * FROM Table
SET NOCOUNT OFF;



Затем я пытаюсь вывести на лист excel результат этой процедуры. Сама процедура вызывается, правильно отрабатывает, но вывод в excel не работает. Причем если перед "Range("A3").CopyFromRecordset rst" не написать "If rst.EOF Then MsgBox "null"", то ничего не выведется, а если написать, выведется первая строка таблицы.


Код: vbnet
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
Sub SalaryReport()

Dim id
Dim newPrice
id = Range("A1")
newPrice = Range("B1")

Dim cn
Set cn = CreateObject("ADODB.Connection")
cn.ConnectionString = "Provider=SQLOLEDB;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Test;Data Source=Slava-PC"
cn.Open

Dim command As ADODB.command
Set command = New ADODB.command

Dim rst As New ADODB.Recordset

command.ActiveConnection = cn
command.CommandText = "[dbo].[upPrice]"
command.CommandType = adCmdStoredProc

command.Parameters.Append command.CreateParameter("id", adInteger, adParamInput, 60, Range("A1"))
command.Parameters.Append command.CreateParameter("newPricet", adInteger, adParamInput, 60, Range("B1"))

 With rst
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open command
End With

Set rst = command.Execute

CountColumn = rst.Fields.Count
    For i = 0 To CountColumn - 1
        Range("A2").Offset(0, i).Value = rst.Fields(i).Name
        WidthColumn = Len(rst.Fields(i).Name) + 2
        If WidthColumn > 20 Then
            WidthColumn = 20
        ElseIf WidthColumn < 6 Then
            WidthColumn = 10
        End If
        Rows(1).WrapText = True
        Rows(1).HorizontalAlignment = xlCenter
        Rows(1).VerticalAlignment = xlCenter
        Rows(1).Interior.ColorIndex = 15
        Columns(i + 1).ColumnWidth = WidthColumn
        Next
    For iCols = 0 To rst.Fields.Count - 1
    Cells(2, iCols + 1).Value = rst.Fields(iCols).Name
    Next
    If rst.EOF Then MsgBox "null"
    Range("A3").CopyFromRecordset rst



    
rst.Close
cn.Close
Set rst = Nothing
Set cn = Nothing
Set command = Nothing
End Sub
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838075
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А шапка всегда корректно заполняется?
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838078
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всё кроме вывода работает, данные в БД изменяются и изменяются верно. Что понимается под шапкой? И да, в самой СУБД всё выводится нормально.
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838079
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, не туда ответил.
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838082
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
za4tooo
Код: vbnet
1.
2.
3.
4.
For i = 0 To CountColumn - 1
        Range("A2").Offset(0, i).Value = rst.Fields(i).Name
        .....
        Next

вот этот вывод шапки - он отрабатывает? Шапка появляется?
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838083
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, да, шапка есть, и первая строка есть, но не всегда.
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838085
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если в процедуре оставить только SELECT * FROM Table, все работает?
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838088
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, неа, результат аналогичный.
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838094
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну значит пустой рекордсет приходит.
Что будет, если просто выполнить
Код: vbnet
1.
2.
Set rst = cn.Execute("SELECT 5 AS AA")
Range("A3").CopyFromRecordset rst
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838096
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, в ячейку А3 записалось 5
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838097
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит на стороне экселя всё в порядке.
Следующий шаг
Код: vbnet
1.
2.
Set rst = cn.Execute("SELECT TOP 10 * FROM MyTable")
Range("A3").CopyFromRecordset rst

При этом в указанной таблице должны быть данные
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838098
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще слегка смущает вот этоza4tooo
Код: sql
1.
SET NOCOUNT OFF

никогда так не делал за бессмысленностью. Может это на что-то умудряется влиять....
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838099
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, да, вывел как нужно.
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838103
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, вообще, странно, она периодически начала завершаться с ошибкой "Превышен максимальный уровень вложенности хранимой процедуры, функции, триггера или представления (ограничение 32).", хотя внутри никаких циклов и вызовов нету. У меня с VBA туговато, это вообще первое, что я делаю на нем.

Код: sql
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.
33.
34.
35.
USE [Test]
GO
/****** Object:  StoredProcedure [dbo].[upSalaryTableTest]    Script Date: 16.07.2019 22:45:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[upSalaryTableTest] (@id int, @newSalaryPercent int) AS

BEGIN
CREATE TABLE #empTemp(
	[ID] [int] NOT NULL,
	[DEPARTMENT_ID] [int] NULL,
	[CHIEF_ID] [int] NULL,
	[NAME] [varchar](100) NOT NULL,
	[SALARY] [int] NOT NULL,)

INSERT INTO #empTemp 
SELECT * FROM EMPLOYEE 

DECLARE @maxSalary int;
DECLARE @chiefSalary int;
update EMPLOYEE set SALARY =  (EMPLOYEE.SALARY / 100) * (100 + @newSalaryPercent) where (DEPARTMENT_ID = @id AND CHIEF_ID != 1);
Select @maxSalary = (SELECT max(salary) FROM employee where DEPARTMENT_ID = @id)
Select @chiefSalary = (select SALARY From EMPLOYEE where DEPARTMENT_ID = @id and CHIEF_ID = 1)
IF @maxSalary > @chiefSalary
update EMPLOYEE set SALARY = @maxSalary where (DEPARTMENT_ID = @id AND CHIEF_ID = 1);


SELECT * FROM #empTemp 
SELECT * FROM EMPLOYEE 
END;

Exec upSalaryTableTest 1, 2
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838104
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
za4toooУ меня с VBA туговатоа причем тут VBA? тут косяк в SQL

Смотри триггеры на таблице EMPLOYEE
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838105
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, их нету
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838115
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь в процедуре пропал SET NOCOUNT ON, он-то точно должен быть
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838151
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
za4toooShocker.Pro, вообще, странно, она периодически начала завершаться с ошибкой "Превышен максимальный уровень вложенности хранимой процедуры, функции, триггера или представления (ограничение 32).", хотя внутри никаких циклов и вызовов нету. У меня с VBA туговато, это вообще первое, что я делаю на нем.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
USE [Test]
GO
/****** Object:  StoredProcedure [dbo].[upSalaryTableTest]    Script Date: 16.07.2019 22:45:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER procedure [dbo].[upSalaryTableTest] (@id int, @newSalaryPercent int) AS

BEGIN
...
SELECT * FROM #empTemp 
SELECT * FROM EMPLOYEE 
END;

Exec upSalaryTableTest 1, 2



вот эту фигню из процедуры уберите
Она хоть за пределами ХП, но срабатывает :-)
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838158
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKotвот эту фигню из процедуры уберите
Она хоть за пределами ХП, но срабатывает :-)А ты прав, видимо. У процедуры ведь необязательно наличие begin-end, так что при отсутствии GO перед exec - этот exec вполне законно будет в теле процедуры при неграмотном вызове этого пакета )
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838468
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, это я поторопился и сюда корявую версию скопировал, результат такой же, когда set nocount on на месте и перед вызовом стоит GO или я его вообще убираю оттуда.
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838475
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так по аналогии дальше режь. Сначала вызов процедуры с простейшим запросом внутри без параметров, потом постепенно добавляешь логику, пока работать не перестанет
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838477
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, так вот это уже не работает и результат такой же- выводится первая строка и шапка. Может нужно как то явно указывать, что процедура возвращает таблицу?
Код: sql
1.
2.
3.
4.
5.
6.
ALTER PROCEDURE [dbo].[PrintTable]	
AS
BEGIN
	Select * From EMPLOYEE
END;
GO
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838500
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
za4toooShocker.Pro, так вот это уже не работает и результат такой же- выводится первая строка и шапка. Может нужно как то явно указывать, что процедура возвращает таблицу?
Код: sql
1.
2.
3.
4.
5.
6.
ALTER PROCEDURE [dbo].[PrintTable]	
AS
BEGIN
	Select * From EMPLOYEE
END;
GO

А как вызывается эта процедура? Через Command?
А если вызвать через
Код: vbnet
1.
Set rst = cn.Execute("exec dbo.PrintTable")

?
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838501
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, ТАДА!!!))) А можно сказать где я дурак и почему вызов через command не работает?
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838503
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
za4tooo
Код: vbnet
1.
2.
3.
4.
5.
6.
 With rst
        .CursorType = adOpenDynamic
        .CursorLocation = adUseClient
        .LockType = adLockOptimistic
        .Open command
End With

а что это вообще за веселая хрень?

Во-первых, нафига ставить блокировки и динамический курсор.
Во-вторых, я не знаю, что за синтаксис rst.Open command, может и рабочий, но команды по жизни вызывались через cmd.Execute
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838507
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, я же говорю, что туго у меня с vba, второй раз в глаза вижу, уроки посмотрел, нашел готовые куски кода, почитал куски доки и поехал лепить, уехал не далеко. А как параметры передать процедуре при таком вызове?
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838509
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, execute я потом дальше увидел.

za4toooнашел готовые куски кодану так это не значит, что их надо лепить бездумно из разных мест, не читая справки по ним.

В итоге рекорсет открывался два раза, что там происходило, сложно сказать и лень думать

Код: vbnet
1.
2.
3.
4.
5.
6.
Set command.ActiveConnection = cn
command.CommandText = "[dbo].[upPrice]"
command.CommandType = adCmdStoredProc
command.Parameters.Append command.CreateParameter("id", adInteger, adParamInput, 60, Range("A1"))
command.Parameters.Append command.CreateParameter("newPricet", adInteger, adParamInput, 60, Range("B1"))
Set rst = command.Execute
...
Рейтинг: 0 / 0
Вывод данных из хранимой процедуры
    #39838516
za4tooo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, спасибо огромное.
Shocker.Pro ну так это не значит, что их надо лепить бездумно из разных мест, не читая справки по ним
Тут согласен, тороплюсь сразу пробовать, а в результате выходит ещё дольше.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вывод данных из хранимой процедуры
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]