php - PHP + SQL - 使用 SQL Server 'Create To' 脚本通过 PHP 创建表
问题描述
在 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 utilitiy statement。
因为我不知道你的类是如何编写的,所以我使用 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()
来获取有关特定错误的其他信息。
推荐阅读
- css - 样式化的组件组件选择器在鼠标悬停时不起作用
- json - 如何在 Dart/flutter 中映射和显示嵌套的 JSON?
- python - 提高 jupyter notebook 中 python 代码的处理速度
- excel - 如何从列表中提取随机对象并在 Excel 中将其删除?
- r - 当列中的值在R中相同时如何合并数据框中的行
- python - 在两个不同的 excel 文件/数据帧中检查具有相同键值的多行值的有效方法是什么?
- python - 从字符串中获取单词
- ios - CALayer 在动画之前已经出现在屏幕上
- linux - sed -n 在文件扩展名中创建一个带有“n”的新文件
- php - Laravel spatie medialibrary 上传不适用于服务器上的 suPHP