【问题标题】:How to pass an array to SQL Server using PHP如何使用 PHP 将数组传递给 SQL Server
【发布时间】:2017-09-18 17:01:03
【问题描述】:

早安,

如果我在 SQL Server 中有以下代码:

CREATE TYPE PartList
AS TABLE
(
    PartID varchar(30),
    Quantity int
);
GO

CREATE PROC spInsertPartList
@List AS PartList READONLY
AS
BEGIN
SET NOCOUNT ON;

INSERT INTO Part (PartID, Quantity)
    VALUES (SELECT PartID, Quantity FROM @List)

END
GO

我现在可以从 PHP 调用此过程,说明如下内容:

$array = array('PartNr123' => 50, 'PartNr25' => 4);
$stmt = mssql_init('spInsertPartList');
mssql_bind($stmt,'@List', &$array, PartList, false,  false);
mssql_execute($stmt);

我找到了 SQL 语句 here 的代码,但不幸的是,该代码示例适用于 C# DataTable。

编辑:

此外,我在执行 SQL 脚本时遇到以下错误:

Msg 2715, Level 16, State 3, Procedure InsertStockTake, Line 194
Column, parameter, or variable #1: Cannot find data type dbo.CallPartList

还有这个:

Msg 1087, Level 16, State 1, Procedure InsertStockTake, Line 200
Must declare the table variable "@partList".

这是由以下代码引起的:

CREATE PROC dbo.InsertStockTake
@partList AS dbo.CallPartList READONLY
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION
            DECLARE @partNr varchar(15), @qtyCount smallint, @qtyDB smallint
            DECLARE curStock CURSOR FOR (SELECT PartNr, Qty FROM @partList)
            OPEN curStock
            FETCH NEXT FROM curCallPart INTO @partNr, @qtyCount
            WHILE @@FETCH_STATUS = 0
                BEGIN           
                    SELECT @qtyDB = StockOH FROM dbo.Stock WHERE PartNr = 
                       @partNr
                    INSERT INTO scArchive.StockLevel(PartNr, 
                       StockOHDatabase, StockOHCounted, DateCaptured) 
                        VALUES (@partNr, @qtyDB, @qtyCount, GETDATE())
                    FETCH NEXT FROM curCallPart INTO @partNr, @qtyCount
                END
            CLOSE curStock
            DEALLOCATE curStock
        COMMIT
    END TRY
    BEGIN CATCH
        THROW;
        ROLLBACK
    END CATCH
END
GO

提前谢谢你

【问题讨论】:

  • 有一点需要注意;您的表类型称为 PartList,但您的 proc 接受 dbo.CallPartList。这可能就是您收到 Cannot find data type dbo.CallPartList 错误的原因
  • 嗨,是的,这是编辑的错误。它们实际上在实际脚本中都称为 dbo.CallPartList
  • mssql_* 函数很古老,已被弃用多年,并已从 PHP 的最后两个版本中删除。更新你的代码!
  • 你应该修改你的代码以接受常规参数;你不能从 PHP 传递自定义数据类型。
  • 谢谢。那不是php中的实际代码。那是我在 PHP 手册网站上获得的代码,只询问是否可以这样使用它。虽然我不再尝试访问 MS SQL Svr,但我还是使用 mysqli 回到了 MySQL。不过谢谢

标签: php sql-server sql-server-2014


【解决方案1】:

不再需要这个问题了。我在 php 中使用了 mysqli_* 并调整了我的表结构并移至 MySQL 而不是 MS SQL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2018-02-06
    • 2014-08-29
    • 2017-10-10
    • 1970-01-01
    • 2021-01-07
    相关资源
    最近更新 更多