我正在使用MSBuild读取我的数据库项目所依赖的所有SQL后部署文件,并将此数据写入一个已加载的主脚本。
我得到了所有需要的文件:
<ReadLinesFromFile File="$(ScriptsList)" >
<Output TaskParameter="Lines" ItemName="IncludedFiles"/>
</ReadLinesFromFile>
然后我批处理它们(逐行读取所有文件到ListedData)
<ReadLinesFromFile File='$(ScriptDirectory)$([System.String]::Copy("%(IncludedFiles.Identity))' Condition="$([System.String]::Copy('%(IncludedFiles.Identity)').Substring(0,2))==':r'">
<Output TaskParameter="Lines" ItemName="ListedData"/>
</ReadLinesFromFile>
找到所有文件没有问题,然后我将其写入output.sql。 但是该文件缺少几行,这使得sqlcmd无法解析output.sql。
来源:
INSERT INTO [Characteristics] (
[CharacteristicID],
[CharName],
[RuleName],
[ActionRuleName],
[CriteriaSetID],
[ActionCriteriaSetID],
[ListCodeID],
[LocalID],
[BomCategory]
)
SELECT ...something,something... from Characteristics
INSERT INTO [CharacteristicDomain] (
[RuleSet],
[CharName],
[CharSlot],
[Description],
[Seq],
[ValueInteger],
[ValueFloat],
[ValueDate],
[ValueString]
)
SELECT ...something,something... from CharacteristicsDomain
如您所见,将有几行带有单个')'括号,任务只读取第一行,然后忽略所有重复项(因为它是一个项目组,而不是列表)。所以实际上我得到一个看起来像这样的文件:
输出:
INSERT INTO [Characteristics] (
[CharacteristicID],
[CharName],
[RuleName],
[ActionRuleName],
[CriteriaSetID],
[ActionCriteriaSetID],
[ListCodeID],
[LocalID],
[BomCategory]
)
SELECT ...something,something... from Characteristics
INSERT INTO [CharacteristicDomain] (
[RuleSet],
[CharName],
[CharSlot],
[Description],
[Seq],
[ValueInteger],
[ValueFloat],
[ValueDate],
[ValueString]
SELECT ...something,something... from CharacteristicsDomain
有人知道使用MSBuild从文件中读取行的方法,但不会丢失重复的行吗? 我想也许有一些方法可以使用Exec任务?我当然不能写自己的任务,我也不允许修改sql文件(我不能依赖用户,他们会按照我需要的方式格式化文件)。我需要用MSBuild读取文件,因为在将它们推送到sqlcmd之前我修改了一些文件。
答案 0 :(得分:1)
你是如何写入output.sql的?如果您正在批量处理%(ListedData.Identity),那么这将只为您提供唯一的行。将它用作@(ListedData),它应该没问题。
答案 1 :(得分:1)
你的第二个ReadLinesFromFile,创建@(ListedData)的那个是错误的。它使用%(IncludedFiles.Identity)进行任务批处理,因此带有“)”的两行都将被放入一个批处理中。