Гость
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вывод данных из хранимой процедуры / 25 сообщений из 28, страница 1 из 2
16.07.2019, 20:02
    #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
16.07.2019, 21:16
    #39838075
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
А шапка всегда корректно заполняется?
...
Рейтинг: 0 / 0
16.07.2019, 21:20
    #39838078
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Всё кроме вывода работает, данные в БД изменяются и изменяются верно. Что понимается под шапкой? И да, в самой СУБД всё выводится нормально.
...
Рейтинг: 0 / 0
16.07.2019, 21:21
    #39838079
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, не туда ответил.
...
Рейтинг: 0 / 0
16.07.2019, 21:28
    #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
16.07.2019, 21:29
    #39838083
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, да, шапка есть, и первая строка есть, но не всегда.
...
Рейтинг: 0 / 0
16.07.2019, 21:57
    #39838085
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
А если в процедуре оставить только SELECT * FROM Table, все работает?
...
Рейтинг: 0 / 0
16.07.2019, 22:22
    #39838088
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, неа, результат аналогичный.
...
Рейтинг: 0 / 0
16.07.2019, 23:11
    #39838094
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Ну значит пустой рекордсет приходит.
Что будет, если просто выполнить
Код: vbnet
1.
2.
Set rst = cn.Execute("SELECT 5 AS AA")
Range("A3").CopyFromRecordset rst
...
Рейтинг: 0 / 0
16.07.2019, 23:32
    #39838096
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, в ячейку А3 записалось 5
...
Рейтинг: 0 / 0
16.07.2019, 23:37
    #39838097
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Значит на стороне экселя всё в порядке.
Следующий шаг
Код: vbnet
1.
2.
Set rst = cn.Execute("SELECT TOP 10 * FROM MyTable")
Range("A3").CopyFromRecordset rst

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

никогда так не делал за бессмысленностью. Может это на что-то умудряется влиять....
...
Рейтинг: 0 / 0
16.07.2019, 23:39
    #39838099
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, да, вывел как нужно.
...
Рейтинг: 0 / 0
16.07.2019, 23:48
    #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
16.07.2019, 23:52
    #39838104
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
za4toooУ меня с VBA туговатоа причем тут VBA? тут косяк в SQL

Смотри триггеры на таблице EMPLOYEE
...
Рейтинг: 0 / 0
17.07.2019, 00:05
    #39838105
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, их нету
...
Рейтинг: 0 / 0
17.07.2019, 00:40
    #39838115
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Теперь в процедуре пропал SET NOCOUNT ON, он-то точно должен быть
...
Рейтинг: 0 / 0
17.07.2019, 08:05
    #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
17.07.2019, 08:49
    #39838158
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
HandKotвот эту фигню из процедуры уберите
Она хоть за пределами ХП, но срабатывает :-)А ты прав, видимо. У процедуры ведь необязательно наличие begin-end, так что при отсутствии GO перед exec - этот exec вполне законно будет в теле процедуры при неграмотном вызове этого пакета )
...
Рейтинг: 0 / 0
17.07.2019, 20:26
    #39838468
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, это я поторопился и сюда корявую версию скопировал, результат такой же, когда set nocount on на месте и перед вызовом стоит GO или я его вообще убираю оттуда.
...
Рейтинг: 0 / 0
17.07.2019, 20:51
    #39838475
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Ну так по аналогии дальше режь. Сначала вызов процедуры с простейшим запросом внутри без параметров, потом постепенно добавляешь логику, пока работать не перестанет
...
Рейтинг: 0 / 0
17.07.2019, 21:11
    #39838477
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, так вот это уже не работает и результат такой же- выводится первая строка и шапка. Может нужно как то явно указывать, что процедура возвращает таблицу?
Код: sql
1.
2.
3.
4.
5.
6.
ALTER PROCEDURE [dbo].[PrintTable]	
AS
BEGIN
	Select * From EMPLOYEE
END;
GO
...
Рейтинг: 0 / 0
17.07.2019, 22:55
    #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
17.07.2019, 22:59
    #39838501
za4tooo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных из хранимой процедуры
Shocker.Pro, ТАДА!!!))) А можно сказать где я дурак и почему вызов через command не работает?
...
Рейтинг: 0 / 0
17.07.2019, 23:08
    #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
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вывод данных из хранимой процедуры / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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