2012-07-26 153 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

相關問題