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() 获取有关特定错误的更多信息。