PHP + SQL - 使用 SQL 服务器 'Create To' 脚本通过 PHP 创建表
PHP + SQL - Using SQL Server 'Create To' scripts to create tables through PHP
在 SQL 服务器中,您似乎可以通过右键单击 table、'Script Table As...' 并选择 'Create To' 来获取 CREATE TABLE 脚本。我已经复制了输出脚本,虽然它看起来确实有效并在粘贴到 'New Query' window 上时创建了 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 服务器实用程序 statement。
因为我不知道你的 class 是怎么写的,所以我使用 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
),对象名称的括号([]
),因为可以在 class 方法中进行一些额外的语法更正。
其他可能导致问题的是权限。
您始终可以使用 sqlsrv_errors()
获取有关特定错误的更多信息。
在 SQL 服务器中,您似乎可以通过右键单击 table、'Script Table As...' 并选择 'Create To' 来获取 CREATE TABLE 脚本。我已经复制了输出脚本,虽然它看起来确实有效并在粘贴到 'New Query' window 上时创建了 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 服务器实用程序 statement。
因为我不知道你的 class 是怎么写的,所以我使用 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
),对象名称的括号([]
),因为可以在 class 方法中进行一些额外的语法更正。
其他可能导致问题的是权限。
您始终可以使用 sqlsrv_errors()
获取有关特定错误的更多信息。