2016-11-30 20 views
8

Ngày tốt, tôi đang cố nhập một tệp XML từ trang web của tôi (PHP). Tôi đã làm một số nghiên cứu về nó và tôi tìm thấy điều này Passing datatable to a stored procedure nhưng cho C#. Vì vậy, có thể gửi nó?Có thể gửi định dạng XML bằng PHP tới máy chủ sql

đây là lưu trữ thủ tục của tôi

USE [sales_web] 
GO 
/****** Object: StoredProcedure [dbo].[InsertSALESPOS] Script Date: 11/30/2016 09:19:48 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 


ALTER PROCEDURE [dbo].[InsertSALESPOS] 

@HeaderTemp HeaderTemp readonly,     
@DetailTemp DetailTemp readonly,     
@PaymentTemp PaymentTemp readonly,     
@VoucherTemp VoucherTemp readonly,     
@LedgerTemp LedgerTemp readonly     

AS     
BEGIN   

set nocount on; 

begin try     
begin transaction     

select ID, TransactionNo, TransactionDate, TotalTransaction, LocationID, UserID, CustomerCode, SendStatus  
into #HeaderTemp from @HeaderTemp    
where TransactionNo not in(SELECT TransactionNo from TransactionHeader with(nolock))     

    INSERT INTO dbo.SalesOrderHeader (TransactionNo, DocumentNo, TransDate, ETADate, ExternalDocument, Reference, RefTransNo, Category, CustomerCode, Remark, Remark2, TermOfPayment,     
    Currency, Rate, UseVAT, SubTotal, DiscPercent, DiscAmount, GrandTotal, TotalReceivable, FromCustomerCode, PostingStatus, PostingBy, PostingDate, CreatedDate, CreatedBy, ModifiedDate,     
    ModifiedBy, CustomerReceivable, LocationCode, VatPercent, VatAmount, FinalReleasedDate_Outlet)     
select h.TransactionNo, h.TransactionNo as DocumentNo, cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as TransDate,     
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as ETADate, '' as ExternalDocument, '' as Reference, '' as RefTransNo,     
    'POS' as Category, h.CustomerCode, '' as Remark, '' as Remark2, Cast('' as Datetime) as TermOfPayment, 'IDR' as Currency, Cast(1 as Float) as Rate,     
    Cast(0 as Bit) as UseVAT, Cast(SUM(d.TotalAmountAfterDisc) as Float) as SubTotal, Cast(0 as Float) as DiscPercent, Cast(0 as Float) as DiscAmount,     
    Cast(SUM(d.TotalAmountAfterDisc) as Float) as GrandTotal, Cast(SUM(d.TotalAmountAfterDisc) as Float) as TotalReceivable,     
    h.CustomerCode as FromCustomerCode, Cast(0 as Bit) as PostingStatus, '' as PostingBy, Cast('' as Datetime) as PostingDate,     
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as CreatedDate, h.UserID as CreatedBy,     
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as ModifiedDate, h.UserID as ModifiedBy, h.CustomerCode as CustomerReceivable,     
    h.CustomerCode as LocationCode, Cast(0 as Float) as VatPercent, Cast(0 as Float) as VatAmount, cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as FinalReleasedDate_Outlet     
    from @HeaderTemp h     
    Inner Join @DetailTemp d on h.id = d.TransactionID and h.CustomerCode = d.CustomerCode     
Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))     
    Group By h.TransactionNo, TransactionDate , h.CustomerCode, h.UserID     

    Insert Into dbo.SalesOrderDetail     
SELECT h.TransactionNo + '-' + Cast(ROW_NUMBER() Over(Order By h.TransactionNo) as Varchar) as TransactionNo, h.TransactionNo as SalesOrderTransNo,     
    h.TransactionNo as RefTransNo, (ROW_NUMBER() Over(Order By h.TransactionNo))*1000 as [LineNo], isnull(d.ItemCode,''), d.Quantity, isnull(d.MainUOMCode,'') as UOM,     
    d.UnitPrice, 0 as DiscountPercent, 0 as VatPercent, (d.Quantity*d.UnitPrice) as AmountPrice,     
    ((d.Quantity*d.UnitPrice)-d.TotalAmountAfterDisc) as AmountDiscount, 0 as AmountVat,     
    d.TotalAmountAfterDisc as Total, d.TotalAmountAfterDisc as Receivable,     
d.UnitPrice as UnitPriceAfterReceivable, '' as ExtraRemark, '' as ExtraRemark2,      
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as CreatedDate, h.UserID as CreatedBy,      
    cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime) as ModifiedDate, h.UserID as ModifiedBy     
    from @HeaderTemp h      
    Inner Join @DetailTemp d on h.id = d.TransactionID and h.CustomerCode = d.CustomerCode     
Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))      

    Insert Into dbo.SalesOrderPayment     
Select h.TransactionNo + '-' + Cast(ROW_NUMBER() Over(Order By h.TransactionNo) as Varchar) as TransactionNo, h.TransactionNo as SalesOrderTransNo,     
    p.PaymentMethodCode, p.TotalDue, p.TotalTendered     
    From @HeaderTemp h     
    Left Join @PaymentTemp p on h.id = p.TransactionID     
    and h.CustomerCode = p.CustomerCode     
    Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))     
--cast(left(h.TransactionDate,len(h.TransactionDate)-6) as datetime)     

    Insert Into dbo.SalesOrderVoucher     
Select h.TransactionNo + '-' + Cast(ROW_NUMBER() Over(Order By h.TransactionNo) as Varchar) as TransactionNo, h.TransactionNo as SalesOrderTransNo,     
    v.VoucherVendor as Voucher, Case When v.VoucherType = '1' Then 'NOMINAL' Else 'PERCENT' End as VoucherType, v.VoucherValue, v.VoucherAmount     
    From @HeaderTemp h     
    Left Join @VoucherTemp v On h.CustomerCode = v.CustomerCode And h.ID = v.TransactionID     
Where h.TransactionNo IN (select TransactionNo from #HeaderTemp with(nolock))  

    Insert Into dbo.ItemLedgerEntry(TransactionNo, SequenceNo, DocumentNo, EntryType,      
CustomerCode, ItemCode, PostingDate, Quantity, UomCode, CreatedDate, CreatedBy)     
Select TransactionNo, SequenceNo, DocumentNo, EntryType,     
CustomerCode, ItemCode, cast(left(PostingDate,len(PostingDate)-6) as datetime) as PostingDate, Cast(Quantity as Float) as Quantity, UomCode, cast(left(CreatedDate,len(CreatedDate)-6) as datetime) as CreatedDate, CreatedBy      
    From @LedgerTemp     
Where DocumentNo in (select Transactionno from #HeaderTemp with(nolock))     



drop table #HeaderTemp     
Select 'Succes' as [Status] 
commit transaction     
end try     
begin catch     
rollback       
    insert into XMLLOGERROR values(getdate(), 'SALESPOS', ERROR_MESSAGE()) 
end catch     
end  

Tôi đã thử cách

$xml=simplexml_load_file($file); 
        $HeaderTemp  = array(); 
        $DetailTemp  = array(); 
        $PaymentTemp = array(); 
        $LedgerTemp  = array(); 
        $VoucherTemp = array(); 
        $tambahan = array('session_id' => date('d:h:i:s')); 
        $login = str_replace(' ', '', $this->input->cookie('cookie_webstore_user')); 
        $session = $login.$tambahan['session_id']; 

        foreach ($xml->HeaderTemp as $HeaderTempnya) 
           { 
            $HeaderTemp[] = $HeaderTempnya; 
           } 
          foreach ($xml->DetailTemp as $DetailTempnya) 
           { 
            $DetailTemp[] = $DetailTempnya; 
           } 
          foreach($xml->PaymentTemp as $PaymentTempnya) 
           { 
            $PaymentTemp[] = $PaymentTempnya; 
           } 
          foreach($xml->LedgerTemp as $LedgerTempnya) 
           { 
            $LedgerTemp[] = $LedgerTempnya; 
           } 
          foreach($xml->VoucherTemp as $VoucherTempnya) 
           { 
            $VoucherTemp[] = $VoucherTempnya; 
           }   

        if($VoucherTempnya != ""){ 
        $this->modelmodel->showsingle("[InsertSALESPOS] '{$HeaderTemp}','{$DetailTemp}','{$PaymentTemp}','{$VoucherTemp}','{$LedgerTemp}'"); 
        }else{ 
        $this->modelmodel->showsingle("[InsertSALESPOS] '{$HeaderTemp}','{$DetailTemp}','{$PaymentTemp}','','{$LedgerTemp}'"); 
        } 

này Với kịch bản của tôi ở trên tôi nhận được lỗi này

Error Number: 22018/206

[Microsoft] [SQL Server Native Client 10.0 ] [SQL Server] Loại Operand đụng độ: varchar không tương thích với HeaderTemp

[InsertSALESPOS] 'mảng', 'Mảng', 'Mảng', '', 'Mảng'

Tên tập tin: D:/xampp/htdocs/new_store/hệ thống/cơ sở dữ liệu/DB_driver.php

Dòng Số: 691

Xin lỗi vì tiếng anh xấu của tôi.

Ok. Tôi đã giải quyết vấn đề của mình ở trên bằng nhiều cách khác nhau. Tôi chỉ tò mò về điều đó nếu không thể, hãy giải thích tại sao.

+2

Tôi không tin PHP hỗ trợ TVP. Tôi tin rằng bạn hoặc là phải vượt qua XML hoặc một chuỗi và có SQL phân tích nó và phá vỡ nó thành các bảng cho các truy vấn của bạn. – ZLK

+0

Tôi hy vọng liên kết này sẽ hữu ích http://stackoverflow.com/questions/2060599/php-sql-server-table-value-parameter/2060793#2060793 – SergeyLebedev

+0

@SergeyLebedev vì vậy, cho đến bây giờ vẫn không được hỗ trợ? – YVS1102

Trả lời

-1

Bạn không phải sử dụng PHP vì nó có thể được chèn trực tiếp thông qua MySQL. Lệnh sẽ như thế nào

LOAD XML LOCAL INFILE '/pathtofile/file.xml' 
INTO TABLE my_tablename(col1, col2, ...); 

Để biết thêm thông tin về dữ liệu XML Đang tải đọc Mysql Documents here

+5

Máy chủ SQL! = MySQL – Leith

2

Có thể với openrowset lệnh để nạp xml vào một bảng trong sql server, để biết thêm thông tin đi qua liên kết https://www.mssqltips.com/sqlservertip/2899/importing-and-processing-data-from-xml-files-into-sql-server-tables/

+0

Vì vậy, với 'php', bạn gửi nó như thế nào? – YVS1102

+0

Viết các câu lệnh sql này vào thủ tục lưu sẵn với tên tệp là tham số và sau đó gọi nó từ php. –

0

Dường như bạn đang cố sử dụng mảng làm giá trị cho trường, trong đó loại trường được xác định là một varchar.

Bạn nên lặp lại đúng mảng mà bạn đang cố gắng sử dụng để chèn và thực thi lệnh chèn trong mỗi vòng lặp sử dụng giá trị hiện tại trong vòng

+0

vâng. Tôi biết. Tôi đã làm điều đó. Tôi có thể gửi nó ở định dạng XML không. – YVS1102

Các vấn đề liên quan