PHP与MSSQL插入NULL错误

时间:2012-04-25 15:23:27

标签: php sql sql-server database tsql

我正在尝试将PHP与Microsoft SQL Server 2008 R2结合使用,这让我想死。我有一个存储过程可以通过我在Mac终端上运行的FreeTDS完美地工作,在Visual Studio中完美运行,并且在FrontPage服务器上通过ASP.NET完美地工作。然而,它在Ubuntu Web服务器上通过PHP 5.3.2惨遭失败。在这个过程中,我设置了一些临时表,并从一个巨大的表中插入它们,这些表总是包含一些空值。我得到的错误是

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驱动程序)给出了奇怪的,半正确的结果。感谢。


编辑:

我修复了链接,实际上只是复制并粘贴了错误的网址。这是临时表声明的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, @term1=@term1, @term2=@term2, @term3=@term3, @term4=@term4, @term5=@term5;
    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 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

如果您创建临时表将使用SELECT ... INTO语句,那么您可以确保它将匹配NewUserInfo表的列,即使您迟到对该表进行更改

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