【问题标题】:Send array of data to SQL Server Stored Procedure in PHP将数据数组发送到 PHP 中的 SQL Server 存储过程
【发布时间】:2020-09-03 04:13:49
【问题描述】:

我在 SQL Server 数据库中有以下两个表:

发票表

ID    | INVOICE_NO |
--------------------
1     | 1000000001 |
2     | 1000000002 |
3     | 1000000003 |

invoice_details 表

ID    | INVOICE_ID | DESCRIPTION | AMOUNT |
-------------------------------------------
1     | 1          | Electricity | 3500.00|
2     | 1          | Telephone   |  750.00|
3     | 2          | Car Service | 6500.00|
4     | 2          | Other       | 1500.00|

我想使用 PHP 脚本将上述详细信息导出到 SQL Server 存储过程。发送时,我想从invoices 表中选择第一行,并从invoice_details 表中选择相关的两行(明智的做法)。所以invoice_details必须在一个数组之类的里面。

我的问题是;

  1. 如何制作 SQL Server 存储过程来完成这项工作?
  2. 如何发送这些详细信息(我可以使用数组将发票详细信息与发票数据一起发送)吗?

如果有人对此有任何想法,请指导。

【问题讨论】:

  • 谷歌表值参数
  • @DaleK 无法从 php 发送 TVP。
  • 这并不优雅,但是...您可以将 invoice_details 数据编码为 XML 并将其作为 @details xml 参数提供给存储过程,将其切碎在 proc 中以插入到 invoice_details 表中。在较新版本的 SQL Server 上,您还可以编码为 JSON 并以@details nvarchar(max) 发送。事实上,如果你遇到了麻烦,你可以将整个批次作为 XML 或 JSON 发送。
  • @LahiruTM JSON 在这里是一个不错的选择。您使用哪个驱动程序连接到 SQL Server,SQL Server 版本是多少?
  • @Zhorov SQL Server 2008,SQL_SRV

标签: php sql-server sql-server-2008 sqlsrv


【解决方案1】:

根据@AlwaysLearning 给出的想法,我能够使用 XML 解决我的问题。

CREATE Procedure [dbo].[insert_xml_data]
(
    @details AS XML = '
    <details>
        <invoice_details>
            <line_id>3</line_id>
            <account_code>5000</account_code>
            <description>Other purchases</description>
            <amount>15250.00</amount>
        </invoice_details>
    </details>
    ';
)
As

BEGIN
    
    INSERT INTO xml_data (account_code,description,amount)
        SELECT  
    t1.c.value('account_code[1]','varchar(100)') As account_code, 
    t1.c.value('description[1]','varchar(50)') as description, 
    t1.c.value('amount[1]','varchar(50)') as amount,
    FROM @details.nodes('/details/invoice_details') t1(c)
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2012-06-21
    • 2020-06-02
    • 1970-01-01
    相关资源
    最近更新 更多