0

Microsoft SQL Server 2008 R2 で PHP を使用しようとしていますが、死にたくなりました。Mac のターミナルで実行する FreeTDS を介して完全に機能し、Visual Studio で完全に機能し、FrontPage サーバー上の ASP.NET を介して完全に機能するストアド プロシージャがあります。ただし、Ubuntu Web サーバー上の PHP 5.3.2 では惨めに失敗します。この手順では、いくつかの一時テーブルを設定し、巨大なテーブルから挿入します。この巨大なテーブルには、常にいくつかの null が含まれています。私が得るエラーは

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

アンダースコアが10億以上あるだけです。誰かがこれをバグとしてここに投稿しましたが、あまり注目されていません。私の最善の試みは、すべての一時テーブルのすべての列に NULL 制約を指定することでしたが、役に立ちませんでした。また試してみSET ANSI_NULLS ONました。パッチやドライバーに関する限り、私はこれらのサーバーのいずれにもあまりアクセスできません。彼らが私を助けるために多くのことをしたいとは思わないが、もし誰かが本当に良いアイデアを思いついたら、私はそれを成し遂げようとするだろう. ああ、それと、SquirrelSQL で (Microsoft JDBC ドライバーを介して) 同じ手順を実行すると、奇妙で​​半分正しい結果が得られることに注意してください。ありがとう。


編集:

リンクを修正しましたが、実際には間違った URL を完全にコピーして貼り付けただけです。一時テーブルが宣言される T-SQL を次に示します。NULL各データ型の後に入れてみました。このように5個あります。

    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は単純です。NewUserInfoテーブル$result = mssql_query("EXEC QuickSearch '" . $search . "';");で NULL が見つかった場合にのみ、エラーが発生します。「メモ」によくあります。

4

2 に答える 2

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);
于 2012-04-26T20:17:01.823 に答える