PHP + SQL — Использование сценариев SQL Server «Create To» для создания таблиц через переполнение стека

В 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());
}
}`

1

Решение

Ваш 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() получить дополнительную информацию о конкретных ошибках.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector