Visual studio 2017 SQL72007:语法检查失败';出现意外的文件结尾。';在附近的批次中:
在SSDT项目中(使用VS2017/VS2015,SSDT版本15.1.61702.140),我无法构建我的项目。编译器不断抱怨PostDeploymentScript中的sql语句(是的,我已将BuildAction属性设置为PostDeploy)。sql语句是: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
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项目时遇到了同样的错误,但情况不同,而且很棘手 我在我的一个数据库表中引入了新列,我需要为该表中已经存在的行填充该列。所以基本上它应该是一次性的过程,因此我决定创建部署后脚本来实现这一点。此部署后脚本
如果您有进入UsersDVP.sql脚本,则不起作用。