2016-10-03 4 views
0

PHP PDOを使用してMSSQLデータベースをゼロから作成するコードを書いている。私は、データベースが作成されていて、今のテーブルを作成するために、.SQLファイルからロードされた文の束を実行する必要があり、データなど私が直接.SQLファイルを実行すると最初の数行はPDO経由で文のバッチを実行するときに構文エラーが発生するが、SSMS経由で問題ない

EXEC sp_dbcmptlevel 'myDbName', 120 
GO 
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled')) 
BEGIN 
EXEC [myDbName].[dbo].[sp_fulltext_database] @action = 'enable' 
END 
GO 
ALTER DATABASE [myDbName] SET ANSI_NULL_DEFAULT OFF 
GO 
EXEC sp_dbcmptlevel 'myDbName', 120 

... 

ですSSMSでは、完全に動作します。私はそれをロードし、PHP PDO経由でそれを実行した場合、私は

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near 'GO'.' in ... 

は、プロファイラを見てもらう、私のクエリは、

declare @p1 int 
set @p1=NULL 
exec sp_prepexec @p1 output,NULL,N'EXEC sp_dbcmptlevel ''myDbName', 120 
... 

で包み、それを準備し、実行ラッパーであること表示されます/前置きされていますサーバーはそれを好まない。私はSQLファイルからコマンドのPHPの負荷のセット全体を実行するために、構文エラーを修正するにはどうすればよい

$db = new PDO('sqlsrv:Server='.$serverName.';Database='.$databaseName, $username, $password); 
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
$db->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8); 
$db->prepare($mySqlScript)->execute(); 

でSQLファイルから読み込むスクリプトを実行していますか?

答えて

1

"GO"句でスクリプトを複数の文に分割し、それを1つずつ実行する必要がありました。以下のような

何か:

$script = file_get_contents('script.sql'); 
$statements = explode('GO', $script); 
foreach($statements as $statement) { 
    // here execute the $statement 
    $sth = $dbh->prepare($statement); 
    $sth->execute(); 
} 

これはSSMSは、内部的に何をすべきかである、「GOさん」の前にそれらを実行することによって文を分割します。

+0

よろしくお願い致します。それはハックとして私の心を越えたが、必要な方法ではなかった。どのような理由で、スクリプト全体をダンプできないのか、あなたは知っていますか?パフォーマンスの問題を考えてみると、すべてを一度に処理できる方が良いでしょう。 – walshy002000

+0

おそらく、それは図書館の目標の1つではなく、実装するのが簡単な動作なので、それを処理するために残されました。 'function execScript($ scriptPath){//分割と実行}'のようにコードを記述することができます。また、元のライブラリの一部であった場合のようにコード内で処理することができます。これは、図書館が何らかの形で(多かれ少なかれ)何をするかということです。 – espino316

関連する問題