Msg 156,级别15,状态1,第16行关键字'附近语法不正确;如果'; ——-------------------------------------------------------- --主持人:192.168.62.245 --服务器版本:Microsoft SQL Server 2014-12.0.2000.8 --服务器操作系统:Windows NT 6.1(构建7601:)(WOW64)(虚拟机监控程序) --HeidiSQL版本:9.5.0.5196 -- -------------------------------------------------------- /*!40101 SET@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT*/; /*!40101集合名称*/; /*!40014设置@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0*/; /*!40101设置@OLD_SQL_MODE=@@SQL_MODE,SQL_MODE='NO_AUTO_VALUE_ON_ZERO'*/; --mjDB的转储数据库结构 如果不存在“mjDB”,则创建数据库; 使用“mjDB”; --表mjDB.PushNotificationLog的转储结构 如果不存在“PushNotificationLog”,则创建表( “pushNotificationLogId”INT(10,0)不为空, “itemType”VARCHAR(20)NULL默认为NULL, “itemId”INT(10,0)NULL默认为NULL, “servicemanId”INT(10,0)NULL默认为NULL, “title”VARCHAR(100)NULL默认为NULL, “body”VARCHAR(4000)NULL默认为NULL, “tranId”INT(10,0)NULL默认为NULL, “createdBy”INT(10,0)NULL默认为NULL, “createdDate”日期时间(3)NULL默认为NULL, 主键(“pushNotificationLogId”) );

Msg 156,级别15,状态1,第16行关键字'附近语法不正确;如果'; ——-------------------------------------------------------- --主持人:192.168.62.245 --服务器版本:Microsoft SQL Server 2014-12.0.2000.8 --服务器操作系统:Windows NT 6.1(构建7601:)(WOW64)(虚拟机监控程序) --HeidiSQL版本:9.5.0.5196 -- -------------------------------------------------------- /*!40101 SET@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT*/; /*!40101集合名称*/; /*!40014设置@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0*/; /*!40101设置@OLD_SQL_MODE=@@SQL_MODE,SQL_MODE='NO_AUTO_VALUE_ON_ZERO'*/; --mjDB的转储数据库结构 如果不存在“mjDB”,则创建数据库; 使用“mjDB”; --表mjDB.PushNotificationLog的转储结构 如果不存在“PushNotificationLog”,则创建表( “pushNotificationLogId”INT(10,0)不为空, “itemType”VARCHAR(20)NULL默认为NULL, “itemId”INT(10,0)NULL默认为NULL, “servicemanId”INT(10,0)NULL默认为NULL, “title”VARCHAR(100)NULL默认为NULL, “body”VARCHAR(4000)NULL默认为NULL, “tranId”INT(10,0)NULL默认为NULL, “createdBy”INT(10,0)NULL默认为NULL, “createdDate”日期时间(3)NULL默认为NULL, 主键(“pushNotificationLogId”) );,sql,sql-server,heidisql,Sql,Sql Server,Heidisql,我从更新至2017年12月19日的HeidiSQL中导出了此版本,当我尝试在SQL Server 2014上运行此版本时,出现以下错误: 味精156,第15级,状态1,第16行 关键字“IF”附近的语法不正确 味精102,15级,状态1,第16行 “mjDB”附近的语法不正确 信息911,16级,状态1,第17行 数据库“mjDB”不存在。确保输入的名称正确 如果使用SQL Server,则创建表语法错误。如果希望在创建表之前检查表是否存在,请像这样更改代码 -- ---------------

我从更新至2017年12月19日的HeidiSQL中导出了此版本,当我尝试在SQL Server 2014上运行此版本时,出现以下错误:

味精156,第15级,状态1,第16行
关键字“IF”附近的语法不正确

味精102,15级,状态1,第16行
“mjDB”附近的语法不正确


信息911,16级,状态1,第17行
数据库“mjDB”不存在。确保输入的名称正确


如果使用SQL Server,则创建表语法错误。如果希望在创建表之前检查表是否存在,请像这样更改代码

-- --------------------------------------------------------
-- Host:                         192.168.62.245
-- Server version:               Microsoft SQL Server 2014 - 12.0.2000.8
-- Server OS:                    Windows NT 6.1 <X64> (Build 7601: ) (WOW64) (Hypervisor)
-- HeidiSQL Version:             9.5.0.5196
-- --------------------------------------------------------

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET NAMES  */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;


-- Dumping database structure for mjDB
CREATE DATABASE IF NOT EXISTS "mjDB";
USE "mjDB";

-- Dumping structure for table mjDB.PushNotificationLog
CREATE TABLE IF NOT EXISTS "PushNotificationLog" (
    "pushNotificationLogId" INT(10,0) NOT NULL,
    "itemType" VARCHAR(20) NULL DEFAULT NULL,
    "itemId" INT(10,0) NULL DEFAULT NULL,
    "servicemanId" INT(10,0) NULL DEFAULT NULL,
    "title" VARCHAR(100) NULL DEFAULT NULL,
    "body" VARCHAR(4000) NULL DEFAULT NULL,
    "tranId" INT(10,0) NULL DEFAULT NULL,
    "createdBy" INT(10,0) NULL DEFAULT NULL,
    "createdDate" DATETIME(3) NULL DEFAULT NULL,
    PRIMARY KEY ("pushNotificationLogId")
);
您还可以通过检查视图
sys.tables

IF object_id('PushNotificationLog') IS NULL
BEGIN
     CREATE TABLE [PushNotificationLog] 
     (
         pushNotificationLogId INT NOT NULL,
         itemType VARCHAR(20) NULL DEFAULT NULL,
         itemId INT NULL DEFAULT NULL,
         servicemanId INT NULL DEFAULT NULL,
         title VARCHAR(100) NULL DEFAULT NULL,
         body VARCHAR(4000) NULL DEFAULT NULL,
         tranId INT NULL DEFAULT NULL,
         createdBy INT NULL DEFAULT NULL,
         createdDate DATETIME NULL DEFAULT NULL,

         PRIMARY KEY (pushNotificationLogId)
    );
END
类似地,检查master.sys.databases表中是否存在数据库

IF NOT EXISTS(SELECT 1 FROM sys.tables WHERE name = 'PushNotificationLog')
BEGIN

END
使用单引号(')而不是双引号(“)
从标识符(DatabaseName、TableName)中删除引号
将列名中的引号替换为方括号([])


您使用的是哪个版本的
Sql Server
?您使用的语法在
Sql Server 2016
中介绍了我认为Sql Server没有
INT(10,0)
数据类型。看起来您正在尝试对SQL Server运行MySQL脚本SQL Server中没有
创建数据库(如果不存在)
创建表(如果不存在)
。检查文档(|)。更新版本(但不是2014)对于某些对象,支持
DROP…IF EXISTS
,以及
CREATE或REPLACE
(仅适用于模块)等语法,但与任何版本中的语法完全不同。@AaronBertrand-[OT]对此有何想法,请在此处发布伪装良好的“请将我的MySQL查询转换为SQL Server!”(1)请不要使用
sysdatabases
,而是使用
sys.databases
(2)为什么在每个列和表名周围都使用字符串分隔符?您不觉得这很难理解吗(对于那些希望这些是字符串文字而不是标识符的读者来说,这可能是不明确的)?@AaronBertrand。感谢您的建议。我已根据MSG 2724,16级,状态4,第4行参数或变量“pushNotificationLogId”的无效数据类型更新了答案。我发现这个问题您不必为INT和DateTime数据类型指定大小。我已更新了answerMsg 911,16级,状态1,第10行数据库“mjDB”d不存在。请确保输入的名称正确。我收到了该消息
IF NOT EXISTS(SELECT 1 FROM master.sys.databases WHERE name = 'mjDB')
    BEGIN

    END
IF NOT EXISTS
(
    SELECT 1
    FROM [master].sys.databases
    WHERE [name] = 'mjDB'
)
    BEGIN CREATE DATABASE mjDB; END
GO

USE mjDB;
GO

-- Dumping structure for table mjDB.PushNotificationLog
IF (OBJECT_ID('dbo.PushNotificationLog', 'U') IS NULL)
    BEGIN
        CREATE TABLE dbo.PushNotificationLog
        (
            [PushNotificationLogID] INT NOT NULL
            , [ItemType] VARCHAR(20)
            , [ItemID] INT
            , [ServicemanID] INT
            , [Title] VARCHAR(100)
            , [Body] VARCHAR(4000)
            , [TranId] INT
            , [CreatedBy] INT
            , [CreatedDate] DATETIME
            , CONSTRAINT PK__PushNotificationLog PRIMARY KEY ([pushNotificationLogId])
        );
    END
GO