首页 > 解决方案 > 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());
    }
}`

标签: phpsqlsql-servercreate-tableweb-development-server

解决方案


您的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()来获取有关特定错误的其他信息。


推荐阅读