Search code examples
visual-studio-2010sql-server-2005msbuildbuild-automationmsbuild-task

MSBUILD: ReadLinesFromFile doesn't read duplicated lines


I'm using MSBuild to read all SQL post-deployment files on which my database project is dependent and I write this data to one main script which is loaded.

I get all needed files:

<ReadLinesFromFile File="$(ScriptsList)" >
  <Output TaskParameter="Lines" ItemName="IncludedFiles"/>
</ReadLinesFromFile>

And then I batch them (reading all files, line by line, into 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>

All files are found without problem and then I write it to output.sql. But the file is missing several lines, which makes output.sql impossible to parse by sqlcmd.

SOURCE:

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

As you see, there will be several lines with a single ')' bracket sign and the task reads only the first line, and then ignores all the duplicates (because it's an item group, not a list). So in effect i get a file looking like this:

OUTPUT:

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

Does someone know a way to read lines from files using MSBuild, but not losing duplicate lines?
I thought maybe there some way to use Exec task? I surely can't write own tasks, and I'm also not allowed to modify sql files (I can't rely on users, that they will format the files the way i need it). I need to read files with MSBuild, because I modify some of them before I push them to sqlcmd.


Solution

  • How are you writing to output.sql? If you are batching on %(ListedData.Identity), then that will give you only unique lines. Use it as @(ListedData) and it should be fine.