В SQL Server вы, кажется, можете получить сценарий CREATE TABLE, щелкнув правой кнопкой мыши таблицу «Таблица сценариев как …» и выбрав «Создать в». Я скопировал выходной скрипт, и, хотя он, кажется, работает и создает таблицу при вставке в окно «Новый запрос», он не работает при использовании в PHP.
Пример кода:
$sqlcommand =
"CREATE TABLE [dbo].[departments](
[department_pk_fk] [varchar](25) NOT NULL,
[des] [varchar](100) NULL,
CONSTRAINT [PK_departamentos] PRIMARY KEY CLUSTERED
(
[department_pk_fk] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
";
$site_api->execQuery($sqlcommand);
У кого-нибудь есть полезная информация о том, почему это произойдет?
Редактировать: execQuery
код:
public function execQuery($q,$scalar=FALSE,$returns=FALSE) {
//return an assoc array or a scalar
global $Cfg, $site_api;
$this->query=$q;
try {
$result_array = array();
$result = $this->conn->query($this->query);
if (is_bool($result)===TRUE) { //if reslt is true or false then there is nothing to do
return $result;
} else {
if (!$scalar) {
if ($result->rowCount()==0)
return null;
//SQLSRV
while($row = $result->fetchAll(SQLSRV_FETCH_ASSOC)) {
$result_array[]=$row;
}
$result->closeCursor();
if($returns) return $result_array[0];
} else {
$row = $result->fetchAll(SQLSRV_FETCH_NUMERIC);
if($returns) return $row[0];
}
}
}
catch (Exception $e) {
print "Error Code <br>".$e->getCode();
print "Error Message <br>".$e->getMessage();
print "Strack Trace <br>".nl2br($e->getTraceAsString());
}
}`
Ваш CREATE
утверждение правильное, просто удалите ключевое слово GO
из вашего сценария. GO
ключевое слово не является частью T-SQL, это утилиты SQL Server заявление.
Поскольку я не знаю, как написан ваш класс, я создал простой скрипт для тестирования с использованием PHP Driver for SQL Server (SQLSRV_FETCH_ASSOC
константа специфична для этого драйвера). Работает правильно без GO
заявление и дает ошибку с этим утверждением (PHP 7.1 и SQL Server Express 2012).
<?php
$server = 'server\instance,port';
$cinfo = array(
"Database"=>'database'
);
$conn = sqlsrv_connect($server, $cinfo);
if( $conn === false )
{
echo "Error (sqlsrv_connect): ".print_r(sqlsrv_errors(), true);
exit;
}
$sql =
"CREATE TABLE [dbo].[departments](
[department_pk_fk] [varchar](25) NOT NULL,
[des] [varchar](100) NULL,
CONSTRAINT [PK_departamentos] PRIMARY KEY CLUSTERED
([department_pk_fk] ASC) WITH (
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
) ON [PRIMARY]";
$stmt = sqlsrv_query($conn, $sql);
if( $stmt === false ) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
echo 'OK'."</br>";
?>
Если вы не знаете, как проверяется оператор SQL, попробуйте удалить имя схемы (dbo
), скобки для имен объектов ([]
), потому что могут быть некоторые дополнительные синтаксические исправления в методе класса.
Другие вещи, которые могут вызвать проблемы, являются разрешениями.
Вы всегда можете использовать sqlsrv_errors()
получить дополнительную информацию о конкретных ошибках.
Других решений пока нет …