2012-07-26 104 views
1

我试图运行一个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 
+0

我对MS SQL并不熟悉,但为什么您使用'SQLFLT8'作为日期的数据类型? – 2012-07-26 13:58:17

回答

1

相信与否,将DATETIME字段设置为VARCHAR,然后以日期时间格式传递'Y-m-d H:i:s'是正确的方式。你也必须确保它后面的字段( @Installed_To_Standards)在传递时具有大写字母“T”,因为它区分大小写。

0

我讨厌在SQL Server中处理日期对象。我所做的解决这个问题的方法是在存储过程中输入每个日期的2个参数。

基本上,一个是VARCHAR(19),只是一个日期字符串。另一个是默认情况下设置为NULL的真正的DATETIME对象。

我有一个检查,看看DATETIME对象是NULL;如果是这样,我将VARCHAR(19)参数转换为DATETIME对象。

这是我使用的PHP时间戳转换为VARCHAR(19)参数的格式化字符串:date("Y-m-d H:i:s",$timestamp);

这是怎样一个VARCHAR(19)转换为datetime存储过程:SET @dateObject = CONVERT(VARCHAR(19),@dateString,120)

这里是存储过程的一个样本:

CREATE PROCEDURE [dbo].[WorkingWithDateObjects] 
-- Add the parameters for the stored procedure here 

@dateString [varchar] (19) = null, -- ex: '2009-07-01 00:00:00.000' 
@dateObject [datetime] = null -- computed in sp from @dateString 

AS 

BEGIN 
SET NOCOUNT ON; 
SET @dateObject = CONVERT(VARCHAR(19),@dateString,120) 

    SELECT * 

    FROM SomeTable 

    WHERE DateField >= @dateObject 

    END 
+0

好吧,我不能访问修改存储过程,我只是将存储过程定义为那样并且必须传递所需的信息 – 2012-07-26 14:12:45

0

您使用12小时格式h。 24小时格式需要H。可能不是你的只有的问题。但它是其中之一。

$commDate = date('Y-m-d H:i:s'); 

我认为问题的根源是使用SQLFLT8的日期PARAMS类型。它应该反映datetime数据。

+0

我尝试了几种不同的输入类型,SQLVARCHAR SQLDATETIME等等,他们似乎都没有工作 – 2012-07-26 14:13:48

相关问题