【问题标题】:Check if $tablename exists in SQL Server 2017, CREATE TABLE $tablename if it doesn't exist检查 SQL Server 2017 中是否存在 $tablename,如果不存在则创建 TABLE $tablename
【发布时间】:2020-04-07 16:27:40
【问题描述】:

我想检查 SQL Server 2017 表 $tablename(由用户以 PHP 表单输入)是否存在:

    try {
        $dothis = "
            IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N$tablename)
               CREATE TABLE $tablename ( id int IDENTITY (1,1), Name text, GeomCol1 geometry, GeomCol2 AS GeomCol1.STAsText() )";
        $tbl = $pdo->exec($dothis);
    } catch(PDOException $e) {
        echo "Error: ".$e->getMessage();
    }

但我总是遇到同样的错误:

SQLSTATE[42S22]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'NNewTable'.

这里也是:

    try {
        $dothis = "
            IF OBJECT_ID ( $tablename, 'U' ) IS NULL 
            BEGIN 
               CREATE TABLE $tablename ( id int IDENTITY (1,1), Name text, GeomCol1 geometry, GeomCol2 AS GeomCol1.STAsText() )
            END";
        $tbl = $pdo->exec($dothis);

错误:

SQLSTATE[42S22]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid column name 'NewTable'.

如果我不先检查表是否存在,则创建表没有问题:

    try {
        $dothis = "
               CREATE TABLE $tablename ( id int IDENTITY (1,1), Name text, GeomCol1 geometry, GeomCol2 AS GeomCol1.STAsText() )";
        $tbl = $pdo->exec($dothis);
    } catch(PDOException $e) {
        echo "Error: ".$e->getMessage();
    }

没有错误,它会创建名为 $tablename 的表

我看到check if a table exists in SQL Server有很多不同的方法

不幸的是,每次我尝试使用 $tablename 变量来检查表是否存在时,它都会返回错误。我希望有人可以提供帮助。

【问题讨论】:

  • 用单引号将表名括起来以表示文字WHERE TABLE_NAME = N'$tablename'IF OBJECT_ID ( N'$tablename', 'U' ) IS NULL
  • 是的,这似乎可以解决问题。

标签: php sql-server pdo odbc sqlsrv


【解决方案1】:

当用作文字时,用单引号将表名括起来。此外,如果名称可能不符合 rules for regular identifiers(例如嵌入的空格),请考虑将表名称括在方括号(或双引号)中。

try {
    $dothis = "
        IF OBJECT_ID ( N'$tablename', 'U' ) IS NULL 
        BEGIN 
           CREATE TABLE [$tablename] ( id int IDENTITY (1,1), Name text, GeomCol1 geometry, GeomCol2 AS GeomCol1.STAsText() )
        END";
    $tbl = $pdo->exec($dothis);

【讨论】:

  • PHP 新手,用引号将变量名括起来感觉不对。但这就是你必须做的。
【解决方案2】:

这也有效:

    try {
        $dothis = "
            if not exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = N'$tablename')
            BEGIN 
               CREATE TABLE $tablename ( id int IDENTITY (1,1), Name text, GeomCol1 geometry, GeomCol2 AS GeomCol1.STAsText() )
            END";
        $tbl = $pdo->exec($dothis);

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2014-07-23
    • 2011-05-12
    • 2011-01-27
    • 2011-09-15
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多