Visual studio 2017 SQL72007:语法检查失败';出现意外的文件结尾。';在附近的批次中:

Visual studio 2017 SQL72007:语法检查失败';出现意外的文件结尾。';在附近的批次中:,visual-studio-2017,sql-server-data-tools,sqlcmd,Visual Studio 2017,Sql Server Data Tools,Sqlcmd,在SSDT项目中(使用VS2017/VS2015,SSDT版本15.1.61702.140),我无法构建我的项目。编译器不断抱怨PostDeploymentScript中的sql语句(是的,我已将BuildAction属性设置为PostDeploy)。sql语句是: if ('$(env)' = 'dvp') BEGIN PRINT 'creating users for dvp' :r .\SecurityAdditions\usersdvp.sql END ELSE

在SSDT项目中(使用VS2017/VS2015,SSDT版本15.1.61702.140),我无法构建我的项目。编译器不断抱怨PostDeploymentScript中的sql语句(是的,我已将BuildAction属性设置为PostDeploy)。sql语句是:

if ('$(env)' = 'dvp')    
BEGIN
    PRINT 'creating users for dvp'
    :r .\SecurityAdditions\usersdvp.sql 
END
ELSE IF ('$(env)' = 'qat')
BEGIN
    PRINT 'creating users for qat'
    :r .\SecurityAdditions\usersqat.sql
END 
实际的错误消息是:

D:\My\File\Path\PostDeploymentScript.sql (lineNum, col): Error: SQL72007:
The syntax check failed 'Unexpected end of file occurred.' in the batch near:

最后一行(结束)中错误消息中引用的行数。你知道是什么原因造成的吗?

显然,问题是由于我引用的文件中的
GO
语句造成的。在
if-else
块中包含
GO
语句无效。这是一篇解释这一点的文章。通过从引用的文件中删除所有
GO
语句,并将
if-else
拆分为两个
if
,我可以让它正常工作

IF ('$(env)' = 'dvp')
BEGIN 
    :R .\SecurityAdditions\UsersDVP.sql
END

IF ('$(env)' = 'qat')
BEGIN
    :R .\SecurityAdditions\UsersQAT.sql
END
GO 

我犯了同样的错误,因为我忘了用GO语句结束部署后脚本中包含的一个脚本。使其难以修复的是,错误将指向下一个脚本中的第一行,而不是缺少GO语句的脚本。

我在尝试在SQL数据库项目中创建数据库用户时遇到了这个问题。将构建操作设置为“无”是没有用的,因为这样在部署期间脚本就不会运行

我使用这样的脚本创建用户:

IF NOT EXISTS (SELECT * FROM sys.sysusers WHERE name='$(DbUserName)')
    BEGIN
        CREATE USER [$(DbUserName)] WITH PASSWORD = '$(DbPassword)';
        ALTER ROLE [db_owner] ADD MEMBER [$(DbUserName)];
    END

我在项目文件中有两个SQLCMD变量,为其中一个设置默认值实际上解决了这个问题。这真的很奇怪,但我希望有一天这能帮助一些可怜的灵魂:)

我想在这里分享我的经验

我在构建我的sql项目时遇到了同样的错误,但情况不同,而且很棘手

我在我的一个数据库表中引入了新列,我需要为该表中已经存在的行填充该列。所以基本上它应该是一次性的过程,因此我决定创建部署后脚本来实现这一点。此部署后脚本

  • 从IF条件开始,以确保对给定数据库只运行一次请注意,这不允许GO语句。
  • 然后创建函数来创建临时函数这需要GO语句才能创建函数,主要是因为它会更改数据库模式这很棘手,因为IF不允许GO语句。
  • 然后使用temp函数更新查询以达到我的要求。没有GO声明,这很好
  • 然后删除函数以删除临时函数。这也是数据库模式更改,理想情况下需要GO语句
  • 在没有任何GO声明的情况下处理这种情况

  • 我创建了一个变量,比如说“@CreateFuntion-NAVARCHAR(MAX)”,并用整个Create-Function语句设置它
  • 使用“EXEC sp_executesql@CreateFunction”执行创建函数。这将在单独的批处理中运行Create函数。我原以为Drop函数需要同样的处理,但在我的例子中,它在没有GO的情况下工作,“EXEC sp_executesql”可能是因为它是脚本中的最后一条语句,无论如何都会在下一批中运行
  • 一切照旧

  • 如果您有进入UsersDVP.sql脚本,则不起作用。