我试图运行一个mssql存储过程,它传递一些用户输入的数据。我直接运行存储过程并且工作正常,但是当我尝试使用附加的代码运行它时,我没有收到任何错误,也没有任何更新。我认为这与传入的日期有关。数据库中的日期字段被定义为'datetime'。它可能是其他东西,但其他存储过程在这个系统上运行相同的方式工作正常。将日期作为输入参数传递给mssql存储过程通过PHP
//initiate function
$proc = mssql_init('usp_Update_Certificate_Customer_Details', $msdb);
//define parameters
$telId = $_POST['telId'];
$certNumber = $_POST['certNumber'];
$custTel = $_POST['main_tel'];
$instRef = $_POST['install_ref'];
//$commDate = $_POST['comm_date'];
$standards = $_POST['standards'];
$commDate = date('Y-m-d h:i:s');
echo 'telid: '.$telId.' certNumber: '.$certNumber.' custTel: '.$custTel.' instRef: '.$instRef.' commDate: '.$commDate.' standards: '.$standards;
mssql_bind($proc, '@Telephone_ID', $telId, SQLINT4, false, false, 10);
mssql_bind($proc, '@Certificate_Number', $certNumber, SQLINT4, false, false, 10);
mssql_bind($proc, '@Customer_Telephone', $custTel, SQLVARCHAR, false, false, 10);
mssql_bind($proc, '@Installers_Reference', $instRef, SQLVARCHAR, false, false, 10);
mssql_bind($proc, '@Commisioned_Date', $commDate, SQLDATETIME, false, false, 10);
mssql_bind($proc, '@Installed_to_Standards', $standards, SQLVARCHAR, false, false, 10);
//Execute Procedure
$result = mssql_execute($proc);
//Free Memory
mssql_free_statement($proc);
当我设置为“SQLDATETIME”我得到一个PHP的警告
Warning: mssql_bind() expects parameter 4 to be long, string given
如果我设置为“SQLVARCHAR”我没有得到任何错误,但该领域运行领域运行如上没发生在数据库中更新
我已经在下面运行存储过程粘贴:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Phil Yeomn
-- Create date: 19-04-2008
-- Description: Update Customer Details
-- =============================================
ALTER PROCEDURE [dbo].[usp_Update_Certificate_Customer_Details](
@Telephone_ID INT,
@Certificate_Number Int,
@Customer_Telephone Varchar(50),
@Installers_Reference Varchar(50),
@Commisioned_Date Datetime,
@Installed_To_Standards Varchar(50)
)
AS
BEGIN
SET NOCOUNT ON;
IF @Telephone_ID <> 0 AND @Customer_Telephone IS NULL
BEGIN
DELETE FROM ssaib.dbo.Telephone_T
WHERE Telephone_ID = @Telephone_ID
SET @Telephone_ID = NULL
END
IF @Telephone_ID = 0 AND @Customer_Telephone IS NOT NULL
BEGIN
INSERT INTO ssaib.dbo.Telephone_T (Telephone_Number_VC, Last_Update_DT)
VALUES (@Customer_Telephone, GETDATE())
SET @Telephone_ID = SCOPE_IDENTITY()
END
IF @Telephone_ID = 0
BEGIN
SET @Telephone_ID = NULL
END
UPDATE ssaib.dbo.Certificate_Returns_T
SET Customer_Telephone_ID = @Telephone_ID,
Installers_Reference_VC = @Installers_Reference,
Commisioned_Date_DT = @Commisioned_Date,
Installed_To_Standards_VC = @Installed_To_Standards
WHERE (Certificate_Return_ID = @Certificate_Number)
END
我在下面粘贴了完整的错误,第一行是传入存储过程的值,只是显示为一个字符串,以检查它们是否全部存在。
telid: 61529 certNumber: 1262789 custTel: 01423 734002 instRef: /3548 commDate: 2012-05-05 00:00:00 standards: PD 6662 and DD 243
Warning: mssql_bind() expects parameter 4 to be long, string given in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 111
Warning: mssql_execute() [function.mssql-execute]: message: Procedure or function 'usp_Update_Certificate_Customer_Details' expects parameter '@Commisioned_Date', which was not supplied. (severity 16) in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 116
Warning: mssql_execute() [function.mssql-execute]: General SQL Server error: Check messages from the SQL Server (severity 16) in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 116
Warning: mssql_execute() [function.mssql-execute]: stored procedure execution failed in /home/ssaibuk/public_html/common/modules/supplier/certificates-direct.php on line 116
我对MS SQL并不熟悉,但为什么您使用'SQLFLT8'作为日期的数据类型? – 2012-07-26 13:58:17