powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Использование sqlsrv с хранимыми процедурами
9 сообщений из 9, страница 1 из 1
Использование sqlsrv с хранимыми процедурами
    #39713848
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Есть хранимая процедура. Да любая может быть хранимка в ней идёт сначала вставка в таблицу записи и далее select в ней.
При выполнении процедуры:

Код: php
1.
2.
3.
4.
5.
6.
if(!sqlsrv_execute($stmt))
       		return '0'; 
while($row = sqlsrv_fetch_array($stmt))
{
$l1 = $row['ErrorMessage'];
}



Вставка записи происходит, а строчку $l1 = $row['ErrorMessage']; не попадает (по отладчику смотрю).
Что можно сделать, всё же туда попадал?
...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39713851
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуйте какой-нибудь sqlsrv_query вместо sqlsrv_execute
...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39714184
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. sqlsrv_query тоже не даёт это сделать.
...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39714312
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975,

у меня тоже всё на хранимках
Попробуйте вывести на экран количество возвращаемых строк, текст ошибок и т.д.
Код: php
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.
<?php

function formatErrors($errors) {
  foreach ($errors as $error) {
    echo 'Error: <span style="color:red; font:13px verdana;">Message: ' . $error['message'] . '</span><br><br>';
  }
}

function getConn() {
  $serverName = 'IP или имя';
  $connectionInfo = ["Database"=>"имя_базы", "UID"=>"sa", "PWD"=>"12345"];
  $conn = sqlsrv_connect($serverName, $connectionInfo);
  if ($conn === false) {die(formatErrors(sqlsrv_errors()));}
  return $conn;
}

  // Далее
  $conn = getConn();
  $s = "exec хранимка ?, ?";

  $params = [...];
  $options = ["Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED]; // без этой опции не получим количество строк
  $q1 = sqlsrv_query($conn, $s, $params, $options);
  if ($q1 === false) {die(formatErrors(sqlsrv_errors()));}

  print_r(sqlsrv_num_rows($q1)); // посмотреть кол-во строк

  while ($row = sqlsrv_fetch_array ($q1,SQLSRV_FETCH_ASSOC)) {
    print_r($row);
  }

  sqlsrv_free_stmt($q1);
  sqlsrv_close($conn);
...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39714395
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в том то и дело, что ошибок нет, а в твою строку print_r($row); не попадает программа (смотрю по отладчику). Ты можешь тоже попробовать сделать любую хранимую процедуру, и в неё insert в таблицу и select любой и посмотреть.
...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39714402
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975,

пробовал, работает

Там возвращается 2 датасета. Перейдите к тому, что возвращает select, через sqlsrv_next_result , типа такого
Код: php
1.
2.
3.
4.
5.
6.
7.
$row_count = sqlsrv_num_rows($stmt);
echo "Row count for First result set = $row_count <br>";

while (sqlsrv_next_result($stmt)) {
	$row_count = sqlsrv_num_rows($stmt);
	echo "Row count for Next result set = $row_count <br>";
}
...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39714735
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Да не получается.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 $sql = "exec [ivcws].[dbo].insertEdf42Kor_php ?,?,?,?,?,?,?,?";
  $options = ["Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED]; // без этой опции не получим количество строк
  $q1 = sqlsrv_query($db_link1, $sql, array($s1,$s2,$s3,$s4,$s5,$s6,$s7,$s8), $options);
  if ($q1 === false) {return '0';}
  $row_count = sqlsrv_num_rows($q1);
  while (sqlsrv_next_result($q1)) {
   $l1 = $row['ErrorMessage'];
    }



хранимка:

Код: 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.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
CREATE PROCEDURE [dbo].[insertEdf42Kor_php]
@P1 int,
@P8 varchar(50),
@P9 varchar(50),
@P3 varchar(20),
@P4 varchar(50),
@P5 varchar(20),
@P6 varchar(20),
@P7 varchar(1)
AS
BEGIN try
	begin transaction
	
	insert into Edf42Kor
	(
	   
	   [lsh],
	   [kdu]      
	  ,[n_pol]
      ,[pol]
      ,[n_pach]
	  ,[datav]
      ,[ls1]
      ,[ls2]
      ,[kaz]
	  ,[ipadr1]
	  ,[mes]
	  ,prtek1
	  

	) values
	 (
	  @P5,
	  @P1, @P8, @P9,'I'+cast(@P1 as varchar(4))
	 ,@P3
	 ,@P5 
	 ,'онл КСК'
	 ,@P6
	 ,@P4 
	 ,MONTH ( getdate() )
	 ,@P7
	 )
	
	commit transaction
	SELECT 'OK' AS ErrorMessage; 
END try
begin catch
SELECT ERROR_MESSAGE() AS ErrorMessage; 
rollback transaction
end catch

GO



таблица:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE [dbo].[Edf42Kor](
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[lsh] [varchar](7) NULL,
	[kdu] [numeric](4, 0) NULL,
	[n_pol] [numeric](3, 0) NULL,
	[pol] [nvarchar](50) NULL,
	[n_pach] [varchar](5) NULL,
	[v_corr] [varchar](1) NULL,
	[reg_v] [varchar](1) NULL,
	[mes] [numeric](2, 0) NULL,
	[datav] [datetime] NULL,
	[ls1] [varchar](7) NULL,
	[ls2] [varchar](7) NULL,
	[kaz] [numeric](1, 0) NULL,
	[ipadr1] [varchar](50) NULL,
	[sn1] [char](1) NULL,
	[prtek1] [numeric](1, 0) NULL
) ON [PRIMARY]



запуск из managment studio:
Код: sql
1.
exec [ivcws].[dbo].insertEdf42Kor_php '974','70','d','10.08.2018','11','0010014','0','0'
...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39714802
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975,

чтобы заработало, поставьте в начало хранимки set nocount on ; http://www.sql.ru/faq/faq_topic.aspx?fid=111
Также рекомендую убрать ненужную транзакцию на вставку. Если insert не пройдет, то сервер сам откатит, и заодно выведет сообщение об ошибке, и в Вашем случае begin try и этот блок
Код: sql
1.
2.
3.
  begin catch
    select error_message() [ErrorMessage];
  end catch

тоже по сути лишнее.
Ошибки на экран выводятся из PHP функцией formatErrors . Ниже работающий код, в котором я всё-таки оставил try...catch
SQL
Код: 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.
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.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
use test

if object_id('dbo.insertEdf42Kor_php') is not null drop procedure [dbo].[insertEdf42Kor_php]
go

Create procedure [dbo].[insertEdf42Kor_php]
  @P1 int,
  @P8 varchar(50),
  @P9 varchar(50),
  @P3 varchar(20),
  @P4 varchar(50),
  @P5 varchar(20),
  @P6 varchar(20),
  @P7 varchar(1)
as
Begin -- процедура insertEdf42Kor_php
  set nocount on;

  begin try
    insert into Edf42Kor (	   
      [lsh],
      [kdu]      
      ,[n_pol]
      ,[pol]
      ,[n_pach]
      ,[datav]
      ,[ls1]
      ,[ls2]
      ,[kaz]
      ,[ipadr1]
      ,[mes]
      ,prtek1
    ) values (
	    @P5,
	    @P1,
      @P8,
      @P9,
      'I'+cast(@P1 as varchar(4))
	    ,@P3
	    ,@P5 
	    ,'онл КСК'
	    ,@P6
	    ,@P4 
	    ,month(getdate())
	    ,@P7
    )
    select 'OK' [ErrorMessage];
  end try
  begin catch
    select error_message() [ErrorMessage];
  end catch
End -- процедура insertEdf42Kor_php
go


if object_id('dbo.Edf42Kor') is not null drop table [dbo].[Edf42Kor]
Create table [dbo].[Edf42Kor] (
	[id] [bigint] IDENTITY(1,1) NOT NULL,
	[lsh] [varchar](7) NULL,
	[kdu] [numeric](4, 0) NULL,
	[n_pol] [numeric](3, 0) NULL,
	[pol] [nvarchar](50) NULL,
	[n_pach] [varchar](5) NULL,
	[v_corr] [varchar](1) NULL,
	[reg_v] [varchar](1) NULL,
	[mes] [numeric](2, 0) NULL,
	[datav] [datetime] NULL,
	[ls1] [varchar](7) NULL,
	[ls2] [varchar](7) NULL,
	[kaz] [numeric](1, 0) NULL,
	[ipadr1] [varchar](50) NULL,
	[sn1] [char](1) NULL,
	[prtek1] [numeric](1, 0) NULL
) ON [PRIMARY]
go


exec [dbo].insertEdf42Kor_php '974','70','d','10.08.2018','11','0010014','0','0'

PHP
Код: php
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.
<?php
function utf8($s) {return iconv('windows-1251','utf-8//IGNORE',$s);}
function formatErrors($errors) {
  foreach ($errors as $error) {
    echo 'Error: <span style="color:red; font:13px verdana;">Message: ' . utf8($error['message']) . '</span><br><br>';
  }
}

function getConn() {
  $serverName = '.\sql2014';
  $connectionInfo = ["Database"=>"test", "UID"=>"sa", "PWD"=>"12345"];
  $conn = sqlsrv_connect($serverName, $connectionInfo);
  if ($conn === false) {die(formatErrors(sqlsrv_errors()));}
  return $conn;
}


$conn = getConn();
$sql = "exec [dbo].insertEdf42Kor_php ?,?,?,?,?,?,?,?";
$params = ['974','70','d','10.08.2018','11','0010014','0','0'];
$options = ["Scrollable" => SQLSRV_CURSOR_CLIENT_BUFFERED]; // без этой опции не получим количество строк
$q1 = sqlsrv_query($conn, $sql, $params, $options);
if ($q1 === false) {die(formatErrors(sqlsrv_errors()));}

echo 'Кол-во строк = ', sqlsrv_num_rows($q1), '<br>';

while ($row = sqlsrv_fetch_array ($q1,SQLSRV_FETCH_ASSOC)) {
  echo '<pre>';
  print_r($row);
}

sqlsrv_free_stmt($q1);
sqlsrv_close($conn);

...
Рейтинг: 0 / 0
Использование sqlsrv с хранимыми процедурами
    #39714843
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо. Получилось.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Использование sqlsrv с хранимыми процедурами
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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