2011-11-10 13 views
2

MSSQLデータベースへのODBC接続でPHPを使用しています。sql insert-1大きなクエリ、または多くの単一クエリ

現在、1つの文字列に約1900個の挿入文があり、セミコロンで区切られ、1つのodbc_execute文で実行されています。

まず、これは悪い方法ですか? forループ内のすべてのinsert文を個別に処理する必要がありますか?

また、私は現在、1つの大きなステートメントで何らかの理由で、最大で483行だけがエラーなしで挿入されています。実行されるステートメントをコピーしてSQLスタジオで実行すると、すべての行が挿入されますが、一度に最大483行しか挿入されません。 これはなぜでしょうか?

答えて

1

INSERTごとに1回のネットワークラウンドトリップは、多くの遅延を意味します。それは非常に遅くなるでしょう。

おそらく、連結されたすべてのSQLステートメントのバッファーサイズには限界があります。

私はあなたが、準備されたステートメントとバインド変数を使用したいと思う:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms712553(v=vs.85).aspx

あなたはまだループの中でそれを処理することができます - 2、実際に。内部ループは、単一トランザクションとして実行されるバッチにINSERTを追加し、必要なすべてのバッチを処理する外部ループを追加する必要があります。

+0

だから、これは基本的に同じodbc_execute文を実行し、その配列をループその後、配列にすべての100行を置くと言って同じですか? – Lock

0

各挿入に対して個別のトランザクションを実行していない限り、一度に挿入するのに問題はありません。

この種の「バッチインサート」では、通常100行ごとにトランザクションを実行します。

私は一度にすべてを詰め込もうとしないでください。それを行うことで本当に得られるものは何もありません。

0

sql-serverのファイル(xml?)にデータを入れ、それを処理するストアドプロシージャをphpに要求することができます。

について、 /トン

関連する問題