【发布时间】: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