2012-04-25 71 views
0

我試圖在Microsoft SQL Server 2008 R2中使用PHP,它使我想死。我有一個完全通過FreeTDS工作的存儲過程,我在我的Mac上在終端中運行,在Visual Studio中完美工作,並通過FrontPage服務器上的ASP.NET完美工作。然而,它在Ubuntu Web服務器上通過PHP 5.3.2失敗了。在這個過程中,我設置了一些臨時表並從一張巨大的桌子插入桌子,桌子總是包含一些空位。我得到的錯誤是帶MSSQL的PHP​​插入NULL錯誤

Cannot insert the value NULL into column 'Notes', table 'tempdb.dbo.#termtable1__00000000BE0B'; column does not allow nulls. INSERT fails. 

只有十億以上的下劃線。有人張貼這個錯誤here,但它沒有得到太多的關注。我最好的嘗試是在每個臨時表的每一列上指定NULL約束,但它沒有幫助。也試過SET ANSI_NULLS ON。就補丁和驅動程序而言,我對這些服務器的訪問並不多,我也沒有太多機會接觸到這些服務的人。我不認爲他們會想要幫助我,但如果有人有一個非常好的主意,我會盡力完成它。噢,應該指出的是,SquirrelSQL中的相同過程(通過Microsoft JDBC驅動程序)給出了奇怪的,半正確的結果。謝謝。


編輯:

我固定的聯繫,實際上只是複製和粘貼完全錯誤的URL。這裏是臨時表被聲明的T-SQL。我試過在每個數據類型後放置NULL。有五個就像這樣。

CREATE TABLE #termtable1 
     (SerialNumber varchar(50), SR varchar(50), LeaseTag varchar(50), Component varchar(50), 
     Fund int, Org int, Program varchar(50), FirstName varchar(80), LastName varchar(30), 
     Department varchar(50), Location varchar(50), UserID nvarchar(20), Notes nvarchar(MAX), 
     Manufacturer varchar(50), Model varchar(50), Maintenance bit, OrderNumber varchar(50), 
     ContractNumber varchar(50), ParentTag varchar(50)); 

他們得到通過動態SQL,這就是爲什麼我不能使用表變量來代替(範圍有關的問題)插入到:

DECLARE @sqlstring nvarchar(MAX); 
DECLARE @params nvarchar(200) = N'@term1 varchar(100), @term2 varchar(100), @term3 varchar(100), @term4 varchar(100), @term5 varchar(100)'; 
DECLARE qryCursor CURSOR FOR SELECT * FROM @terms; 
OPEN qryCursor; 
FETCH NEXT FROM qryCursor INTO @term1, @term2, @term3, @term4, @term5; 
DECLARE @termrow int = 1; 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SET @sqlstring = N'INSERT INTO #termtable' + CAST(@termrow AS varchar) + N' SELECT * FROM dbo.NewUserInfo WHERE '; 
    DECLARE @i int = 1; 
    WHILE (@i <= 5) 
    BEGIN 
     SET @sqlstring = @sqlstring + 
     N'(SerialNumber LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'SR LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'LeaseTag LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Component LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Fund LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Org LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Program LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'FirstName LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'LastName LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Department LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Location LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Notes LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Manufacturer LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Model LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'Maintenance LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'OrderNumber LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'ContractNumber LIKE @term' + CAST(@i AS varchar) + N' OR ' + 
     N'ParentTag LIKE @term' + CAST(@i AS varchar) + N') OR '; 
     SET @i = @i + 1; 
    END 
    SET @sqlstring = @sqlstring + N'(0 = 1)'; 
    EXECUTE sp_executesql @sqlstring, @params, @[email protected], @[email protected], @[email protected], @[email protected], @[email protected]; 
    SET @termrow = @termrow + 1; 
    FETCH NEXT FROM qryCursor INTO @term1, @term2, @term3, @term4, @term5; 
END 

的PHP很簡單。 $result = mssql_query("EXEC QuickSearch '" . $search . "';");它僅在NewUserInfo表中找到NULL時纔給出錯誤。經常在「註釋」中。

+2

來自PHP。你也可能想用「奇怪的,半正確的結果」來說明你的意思(儘管也許在另一個問題上)。聽起來像你有多個問題。 – 2012-04-25 15:32:12

+1

您的鏈接受密碼保護。無論如何,沒有一行代碼(PHP或T-SQL)很難提供幫助。 – 2012-04-25 15:33:39

+0

聽起來像你需要一個黑客 - 是否有可能不使用臨時表? – dfb 2012-04-25 15:33:59

回答

1

好的,我很抱歉。在每個數據類型確實工作後放NULL。當我第一次嘗試時,我一定錯過了一對夫婦。表聲明應該是這樣的:

CREATE TABLE #termtable1 
     (SerialNumber varchar(50) NULL, SR varchar(50) NULL, LeaseTag varchar(50) NULL, Component varchar(50) NULL, 
     Fund int NULL, Org int NULL, Program varchar(50) NULL, FirstName varchar(80) NULL, LastName varchar(30) NULL, 
     Department varchar(50) NULL, Location varchar(50) NULL, UserID varchar(20) NULL, Notes varchar(MAX) NULL, 
     Manufacturer varchar(50) NULL, Model varchar(50) NULL, Maintenance bit NULL, OrderNumber varchar(50) NULL, 
     ContractNumber varchar(50) NULL, ParentTag varchar(50) NULL); 
0

如果創建臨時表是使用一個SELECT ... INTO語句,那麼你可以肯定的是它將即使匹配NewUserInfo表的列你如果你想輸入你需要顯示您的存儲過程的代碼(至少創建並填充部分`#termtable1`),以及如何你調用過程後期更改該表

SET @sqlstring = N'SELECT * FROM dbo.NewUserInfo INTO #termtable' + CAST(@termrow AS varchar) + N' WHERE 1=0';