私は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を検出した場合にのみエラーが発生します。 「ノート」で頻繁に使用されます。
に変更を加えますPHPから。また、おそらく別の質問にもかかわらず、 "奇妙な、半分の正しい結果"が意味するものを詳しく説明したいと思うでしょう。あなたには複数の問題があるように聞こえます。 –
あなたのリンクはパスワードで保護されています。単一のコード行(PHPやT-SQL)を使用しなくても手助けするのは難しいです。 –
あなたはハッキングが必要なように聞こえます - 一時表を使用できないのでしょうか? – dfb