2012-04-25 13 views
0

私はMicrosoft SQL Server 2008 R2でPHPを使用しようとしています。 FreeTDS経由で完全に動作するストアドプロシージャがあり、Macのターミナルで実行し、Visual Studioで完全に動作し、FrontPageサーバー上のASP.NET経由で完全に動作します。しかし、Ubuntu Webサーバー上でPHP 5.3.2を使用すると悲惨なことに失敗します。この手順では、いくつかの一時テーブルを設定し、巨大なテーブルからそれらのテーブルに挿入します。テーブルには、常にnullがいくつか含まれています。私が得るエラーは、何十億ものアンダースコアがあるだけで、PHP with MSSQL 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ドライバ経由)は、奇妙な半分の結果をもたらすことに注意してください。ありがとう。


EDIT:

私は実際にちょうどコピーして、完全に間違ったURLを貼り付け、リンクを修正しました。 tempテーブルが宣言される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, @[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から。また、おそらく別の質問にもかかわらず、 "奇妙な、半分の正しい結果"が意味するものを詳しく説明したいと思うでしょう。あなたには複数の問題があるように聞こえます。 –

+1

あなたのリンクはパスワードで保護されています。単一のコード行(PHPやT-SQL)を使用しなくても手助けするのは難しいです。 –

+0

あなたはハッキングが必要なように聞こえます - 一時表を使用できないのでしょうか? – dfb

答えて

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'; 
関連する問題