2012-04-25 70 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';