为什么SqlCmd MSBuild任务在与TFS team build一起运行时引发错误?

为什么SqlCmd MSBuild任务在与TFS team build一起运行时引发错误?,msbuild,Msbuild,我在上问过这个问题,但我想我会试着让更多的人关注它,以防其他人也有类似的经历: 我有一个非常简单的任务,应该在一个文件夹中执行一系列sql脚本文件。(任务位于名为OperationalDB.msbuild的文件中)。任务如下所示: <MSBuild.ExtensionPack.SqlServer.SqlCmd TaskAction="Execute" Server="$(SqlServerName)" Database="$(SqlCatalogName)"

我在上问过这个问题,但我想我会试着让更多的人关注它,以防其他人也有类似的经历:

我有一个非常简单的任务,应该在一个文件夹中执行一系列sql脚本文件。(任务位于名为OperationalDB.msbuild的文件中)。任务如下所示:

<MSBuild.ExtensionPack.SqlServer.SqlCmd
    TaskAction="Execute"
    Server="$(SqlServerName)"
    Database="$(SqlCatalogName)"
    InputFiles="@(OperationalStaticDataFiles)"
/>

作为TFS 2008团队构建的一部分运行时失败。日志错误显示:

C:\b\56\S\Main\Builds\OperationalDB.msbuild:警告:退出代码1。失败:Sqlcmd:Error:ReadTextLine出现内部错误(原因:未指定的错误)

更糟糕的是,(从调试的角度来看),如果我使用运行team build服务的同一帐户登录到生成服务器,并从命令行运行OperationalDB.msbuild到msbuild,那么它工作得很好。没有错误,所有SQL都会执行

我对该任务的理解是,它包装了SQLCmd控制台应用程序。所以我也试着在构建服务器上运行它。它也起了作用。组合中的变量似乎是TFS团队构建。但它并没有让我了解如何调查它——只是上面列出的错误


有什么想法吗?

首先,如果我必须花钱,我敢打赌你对执行这些操作的帐户做出了假设,问题的原因是某些安全设置或其他。其次,我强烈建议在TFS sql server上运行探查器,以查看谁在做什么以及如何做。用五分钟的时间来分析可能会发现问题。威尔,这是一个很好的电话,但还是没能让我渡过难关。SQL跟踪表明了一些有趣的事情:我所期望的身份正在进行SQL调用,但是命令没有通过。它不是T-SQL,而是(显然)向SQL Server发送一个空字符串。这让我很兴奋,因为我认为这将是一个文件路径的东西。我认为TeamBuild在SQLCmd任务上强制使用不同的方法解析文件路径。我甚至在开发服务器上对SQL文件的路径进行了硬编码,但即使这样也没有解决问题。(续)唉,我想我已经在这个问题上花了足够的时间,并找到了解决办法。我构建了一个小的批处理文件,找到了sql脚本,循环遍历它们,并将它们逐个传递到SQLCmd控制台应用程序。然后,我使用Exec任务从MSBuild运行批处理文件。工作很有魅力,但仍然让我感到不满意。也许当我有空闲时间时,我会深入研究任务的源代码。在cygwin bash环境中(但不是在cmd shell中)尝试将文件管道传输到sqlcmd时,我会遇到同样的错误。我的怀疑是,cygwin的bash将管道生成到sqlcmd中的方式有些“奇怪”或不同,以至于sqlcmd不喜欢它。也许MSBuild也有同样的问题?没什么可去的我,我知道,。。。与您类似,我只是将文本推送到一个临时文件,然后使用-I选项使用它-然后效果很好。看看哪一个可能是重复的。首先,如果我必须花钱,我敢打赌您正在对执行这些操作的帐户进行假设,并且问题的原因是某些安全设置或其他。其次,我强烈建议在TFS sql server上运行探查器,以查看谁在做什么以及如何做。用五分钟的时间来分析可能会发现问题。威尔,这是一个很好的电话,但还是没能让我渡过难关。SQL跟踪表明了一些有趣的事情:我所期望的身份正在进行SQL调用,但是命令没有通过。它不是T-SQL,而是(显然)向SQL Server发送一个空字符串。这让我很兴奋,因为我认为这将是一个文件路径的东西。我认为TeamBuild在SQLCmd任务上强制使用不同的方法解析文件路径。我甚至在开发服务器上对SQL文件的路径进行了硬编码,但即使这样也没有解决问题。(续)唉,我想我已经在这个问题上花了足够的时间,并找到了解决办法。我构建了一个小的批处理文件,找到了sql脚本,循环遍历它们,并将它们逐个传递到SQLCmd控制台应用程序。然后,我使用Exec任务从MSBuild运行批处理文件。工作很有魅力,但仍然让我感到不满意。也许当我有空闲时间时,我会深入研究任务的源代码。在cygwin bash环境中(但不是在cmd shell中)尝试将文件管道传输到sqlcmd时,我会遇到同样的错误。我的怀疑是,cygwin的bash将管道生成到sqlcmd中的方式有些“奇怪”或不同,以至于sqlcmd不喜欢它。也许MSBuild也有同样的问题?没什么可去的我,我知道,。。。与您类似,我只是将文本推送到一个临时文件中,然后使用-I选项来使用它-然后工作正常。看看哪一个可能是重复的。