我試圖在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時纔給出錯誤。經常在「註釋」中。
來自PHP。你也可能想用「奇怪的,半正確的結果」來說明你的意思(儘管也許在另一個問題上)。聽起來像你有多個問題。 – 2012-04-25 15:32:12
您的鏈接受密碼保護。無論如何,沒有一行代碼(PHP或T-SQL)很難提供幫助。 – 2012-04-25 15:33:39
聽起來像你需要一個黑客 - 是否有可能不使用臨時表? – dfb 2012-04-25 15:33:59