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 が見つかった場合にのみ、エラーが発生します。「メモ」によくあります。