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

Пробую в php использовать user-defined table types, не получается. Как правильно этот сделать?

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
$data1 = array();
        $data1[0]['lsh'] = '1100025';
        $data1[0]['kdu'] = 974;
        $data1[0]['phol2'] = 1;
        $data1[0]['pgor2'] = 2;
        $data1[0]['pelen2'] = 3;
        $data1[0]['pelenn2'] = 4;
        $data1[0]['poto2'] = 5;
        $data1[1]['lsh'] = '1100050';
        $data1[1]['kdu'] = 974;
        $data1[1]['phol2'] = 11;
        $data1[1]['pgor2'] = 21;
        $data1[1]['pelen2'] = 31;
        $data1[1]['pelenn2'] = 41;
        $data1[1]['poto2'] = 51;
        $sql = "exec [ivcws].[dbo].insertEDF33POK ?,?,?,?,?,?";
	$stmt = sqlsrv_prepare($db_link1, $sql, array(974,$data1,'11.11.2018','1','11.11.2018','') );  
        if(!sqlsrv_execute($stmt))
        {
        $v1=sqlsrv_errors();    
        die(sqlsrv_errors());
        }



Скрипты:

Код: 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.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
/****** Object:  UserDefinedTableType [dbo].[EDF33POK_TYPE]    Script Date: 21.11.2018 9:21:06 ******/
CREATE TYPE [dbo].[EDF33POK_TYPE] AS TABLE(
	[lsh] [varchar](10) NULL,
	[kdu] [numeric](4, 0) NULL,
	[phol2] [numeric](11, 2) NULL,
	[pgor2] [numeric](11, 2) NULL,
	[pelen2] [numeric](11, 2) NULL,
	[pelenn2] [numeric](11, 2) NULL,
	[poto2] [numeric](11, 2) NULL
)


ALTER PROCEDURE [dbo].[insertEDF33POK]
@P1 int,
@dt as EDF33POK_TYPE  readonly,
@P3 varchar(20),
@P4 varchar(50),
@P5 varchar(20),
@P6 varchar(20)
AS
BEGIN try
	begin transaction
	
	
	declare @P8 varchar(20)
	select top 1  @P8= t1.lsh from @dt t1 ;
	if ((rtrim(ltrim(@P8))<>'') and (@P8 is not null)) 
	begin
	

	insert into edf33pok
	(
	   
	   [lsh],
	   [kdu]
      ,[phol2]
      ,[pgor2]
      ,[pelen2]
      ,[pelenn2]
      ,[poto2],
	  [mes],
	  [nakt],
	  [datev],
	  [ipadr1]
	  ,[datael2]
	  
	  ,[god]
	  ,[kul]
      ,[knd]
      ,[kkw]

	)
	 select t1.*,MONTH ( getdate() ),'I'+cast(@P1 as varchar(4))
	 ,@P3
	 ,@P4  
	 ,(case when ltrim(rtrim(@P5))='' then null else @P5 end) 
	
	 ,  substring(cast(YEAR(getdate()) as varchar(4)),3,2 )

	 ,(SELECT TOP 1 [kul]
     
 
 FROM [ivcws].[dbo].[EDFN01SP] t2 where t2.LSH=t1.LSH)
 
      ,(SELECT TOP 1 [knd]
      
  FROM [ivcws].[dbo].[EDFN01SP] t2 where t2.LSH=t1.LSH)
      ,(SELECT TOP 1 [kkw]
  FROM [ivcws].[dbo].[EDFN01SP] t2 where t2.LSH=t1.LSH)
  
	 --SUBSTRING(@P3,4,2)+'.'+SUBSTRING(@P3,1,2)+'.'+SUBSTRING(@P3,7,4)
	 from @dt t1;
	
	commit transaction
	SELECT N'OK' AS ErrorMessage; 

	
	end
	else
	begin
	SELECT '1' AS ErrorMessage;
	rollback transaction
	end
	

END try
begin catch
SELECT ERROR_MESSAGE() AS ErrorMessage; 
rollback transaction
end catch



Выдаётся ошибка:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
array(1) (
  [0] => array(6) (
    [0] => (string) IMSSP
    [SQLSTATE] => (string) IMSSP
    [1] => (int) -15
    [code] => (int) -15
    [2] => (string) An invalid direction for parameter 2 was specified. SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, and SQLSRV_PARAM_INOUT are valid values.
    [message] => (string) An invalid direction for parameter 2 was specified. SQLSRV_PARAM_IN, SQLSRV_PARAM_OUT, and SQLSRV_PARAM_INOUT are valid values.
  )
)
...
Рейтинг: 0 / 0
Использование user-defined table types
    #39736132
SQLPowerUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975,

тут смотрю в качестве параметра используется таблица, но это ещё не поддерживается драйвером PHP MSSQL
https://stackoverflow.com/questions/2060599/php-sql-server-table-value-parameter

Вместо таблицы можно передавать, например, строку XML, а на стороне SQL-сервера наша строка легко превращается в таблицу
Примеров в гугле полно, приведу 2 штуки
Код: 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.
--Если вы используете в своей работе тип данных XML, а особенно Методы типа данных XML, то вам необходимо отслеживать, что настройка set quoted_identifier имеет значение ON
set quoted_identifier on


-- Пример 1
declare @xmlStr xml
SET @xmlStr = '<?xml version="1.0" encoding="utf-8"?>
<batch>
  <page pageNumber="1" pageTemplate="Act">
    <block blockName="DocNumber">95420205</block>
    <block blockName="DocDate">15.07.2009</block>
    <block blockName="Summa">7000.00</block>
  </page>
  <page pageNumber="2" pageTemplate="Act">
    <block blockName="DocNumber">82420206</block>
    <block blockName="DocDate">16.07.2009</block>
    <block blockName="Summa">3000.00</block>
  </page>
</batch>'

select n.value('@pageNumber[1]','INT') as  ID
     , n.value('(block[@blockName="DocNumber"]/text())[1]','nvarchar(max)') [DocNumber]
     , n.value('(block[@blockName="DocDate"]/text())[1]','nvarchar(max)')   [DocDate]
     , n.value('(block[@blockName="Summa"]/text())[1]','nvarchar(max)')  [Summa]
from  @xmlStr.nodes('/batch/page')as  t(n)


-- Пример 2
declare @XMLString xml 
set @XMLString = '
<catalog>
  <category id="FC63AB2B-43BB-4529-9EA0-0AD691F53A02" parent="04030AB1-678B-457D-8976-AC7297C65CE6" name="08. Системы хранения информации" dr="true" iduc="FC63AB2B-43BB-4529-9EA0-0AD691F53A02" vetomrazdele="0">
    <category id="305D0703-5D4D-43ED-9481-B5FEC3E85159" parent="FC63AB2B-43BB-4529-9EA0-0AD691F53A02" name="Внешние дисковые массивы" dr="true" iduc="305D0703-5D4D-43ED-9481-B5FEC3E85159" vetomrazdele="62">
      <position id="006001/60" articul="AJ743A_DEMO" name="HP 2012fc DC Modular Smart Array ( 6x300Gb 15K SAS, 6x750Gb 7.2K SATA HDDs, 2xCntr (1Gb cache) with 2 LC Connectors, 4x2m LC/LC cbls)" vendor="HP" vendor-id="7" gp="Нет гарантии" price="17736.10" dprice="17736.10" outoftrade=" " uchmark="" sale="0" freenom="0" freeptrans="0" ntdate="" ntstatus=""/>
    </category>
    <category id="39DB75D9-3934-4180-ABEF-3E380DD4AEC4" parent="FC63AB2B-43BB-4529-9EA0-0AD691F53A02" name="Ленточные устройства" dr="true" iduc="39DB75D9-3934-4180-ABEF-3E380DD4AEC4" vetomrazdele="0">
       <category id="25D17055-C1F7-4FB2-B89B-14886A4BA82F" parent="39DB75D9-3934-4180-ABEF-3E380DD4AEC4" name="Ленточные автозагрузчики и библиотеки" dr="true" iduc="25D17055-C1F7-4FB2-B89B-14886A4BA82F" vetomrazdele="24">
         <position id="014002004/528" articul="142257-002" name="PDU Cable - 10A, IEC320 -C14 to IEC 320 -C13 (8ft/2.5m)" vendor="HP" vendor-id="7" gp="1 год" price="14.80" dprice="14.80" outoftrade=" " uchmark="" sale="0" freenom="много" freeptrans="много" ntdate="2010-05-15T00:00:00" ntstatus="ОП"/>
       </category>
      <category id="03DD10DD-190E-49AC-BF61-0BC719E30DB2" parent="39DB75D9-3934-4180-ABEF-3E380DD4AEC4" name="Одиночные ленточные накопители" dr="true" iduc="03DD10DD-190E-49AC-BF61-0BC719E30DB2" vetomrazdele="34">
        <position id="006001/97" articul="AJ766A#ABB_DEMO" name="HP StorageWorks RDX 160 USB Drive, Ext. (RDX 160/320Gb; incl. HP Data Protector Express; 1 data ctr; usb cabl., power supply with cord) DEMO" vendor="HP" vendor-id="7" gp="Нет гарантии" price="500.00" dprice="500.00" outoftrade=" " uchmark="" sale="0" freenom="1" freeptrans="1" ntdate="" ntstatus=""/>
      </category>
    </category>
  </category>
</catalog>'
--select @xmlstring


select cat.c.value('@id', 'uniqueidentifier'),
pos.c.value('@id', 'varchar(50)') as id,
pos.c.value('@articul', 'varchar(50)') as articul,
pos.c.value('@name', 'varchar(500)') as [name],
pos.c.value('@vendor', 'varchar(500)') as [vendor],
pos.c.value('@gp', 'varchar(500)') as [gp],
pos.c.value('@price', 'varchar(500)') as [price],
pos.c.value('@dprice', 'varchar(500)') as [dprice]
from @XMLString.nodes('//category[@vetomrazdele > 0]') cat(c)
cross apply cat.c.nodes('position') pos(c)


Ещё советы.

- где set nocount on? https://www.sql.ru/faq/faq_topic.aspx?fid=111

- параметры @P3, @P5 передаются как дата, а в хранимке у них тип = varchar(20). Поменяйте varchar на date , а чтобы даты похожие на 31.03.2018 обрабатывались нормально, напишите после set nocount on   ещё одну строчку: set dateformat dmy

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


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