When the SSRS server expands expressions such as Parameters!BeginDate.Label the rendering will provide the labels provided with the data regardless if the data is bound to a DataSet or the literal value(s) coming from valid values. If there are no labels, then the expression will display the value(s) as the values.
https://learn.microsoft.com/en-us/sql/reporting-services/report-design/built-in-collections-parameters-collection-references-report-builder?view=sql-server-ver17
However in the nuget package up to the current version 15.1.33, any parameters which derive values from datasets, do not expand to labels correctly. These always default to the values passed instead which should be a fallback option and not the primary behavior. The Parameters should expand to using the label specified from the DataSet column specified before falling back to the parameter value.
using Microsoft.Reporting.NETCore;
using System.Text;
namespace RDLC_test
{
public class ParameterLabelBugPoC
{
public static void Main(string[] args) {
DataSetsDoNotExpandLabelExpressions();
}
public static void DataSetsDoNotExpandLabelExpressions()
{
var rdlBytes = Encoding.UTF8.GetBytes(ParameterLabelBugPoC.RDL);
var DataSetInteger = new List<dynamic>() {
new
{
LabelColumn = "Db Label 1",
ValueColumn = "1",
},
new
{
LabelColumn = "Db Label 2",
ValueColumn = "2",
},
new
{
LabelColumn = "Db Label 3",
ValueColumn = "3",
}
};
var DataSetText = new List<dynamic>() {
new
{
LabelColumn = "Db Label 1",
ValueColumn = "1",
},
new
{
LabelColumn = "Db Label 2",
ValueColumn = "2",
},
new
{
LabelColumn = "Db Label 3",
ValueColumn = "3",
}
};
LocalReport report = new LocalReport();
report.LoadReportDefinition(new MemoryStream(rdlBytes));
var testParam = report.GetParameters();
report.DataSources.Add(new(nameof(DataSetInteger), DataSetInteger));
report.DataSources.Add(new(nameof(DataSetText), DataSetText));
report.SetParameters(new ReportParameter("ValidValuesParameterInteger", new string[] { "1", "2", "3" }));
report.SetParameters(new ReportParameter("ValidValuesParameterText", new string[] { "a", "b", "c" }));
report.SetParameters(new ReportParameter("DataSetValuesParameterInteger", new string[] { "1", "2", "3" }));
report.SetParameters(new ReportParameter("DataSetValuesParameterText", new string[] { "a", "b", "c" }));
var tiffBytes = report.Render("IMAGE");
//The left side should display Db Label, but they differ as only valid values will display labels, and the datasets will display values
File.WriteAllBytes("./BugPoC.tiff", tiffBytes);
}
public static string RDL = @"
<?xml version=""1.0"" encoding=""utf-8""?>
<Report MustUnderstand=""df"" xmlns=""http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition"" xmlns:rd=""http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"" xmlns:df=""http://schemas.microsoft.com/sqlserver/reporting/2016/01/reportdefinition/defaultfontfamily"" xmlns:am=""http://schemas.microsoft.com/sqlserver/reporting/authoringmetadata"">
<rd:ReportUnitType>Inch</rd:ReportUnitType>
<rd:ReportID>3c4a510f-8d9b-4b8e-b85b-37b7e9f2538e</rd:ReportID>
<am:AuthoringMetadata>
<am:CreatedBy>
<am:Name>MSRB</am:Name>
<am:Version>15.1.30001.02</am:Version>
</am:CreatedBy>
<am:UpdatedBy>
<am:Name>MSRB</am:Name>
<am:Version>15.1.30001.02</am:Version>
</am:UpdatedBy>
<am:LastModifiedTimestamp>2026-04-17T15:42:00.1667508Z</am:LastModifiedTimestamp>
</am:AuthoringMetadata>
<df:DefaultFontFamily>Segoe UI</df:DefaultFontFamily>
<AutoRefresh>0</AutoRefresh>
<DataSources>
<DataSource Name=""DATABASE"">
<rd:SecurityType>None</rd:SecurityType>
<ConnectionProperties>
<DataProvider>SQL</DataProvider>
<ConnectString />
</ConnectionProperties>
<rd:DataSourceID>d9e9083c-dd7f-4f7d-9879-e83bbc879571</rd:DataSourceID>
</DataSource>
</DataSources>
<DataSets>
<DataSet Name=""DataSetText"">
<Query>
<DataSourceName>DATABASE</DataSourceName>
<CommandType>StoredProcedure</CommandType>
<CommandText>dbo.text_data</CommandText>
</Query>
<Fields>
<Field Name=""ValueColumn"">
<rd:UserDefined>true</rd:UserDefined>
<DataField>ValueColumn</DataField>
</Field>
<Field Name=""LabelColumn"">
<rd:UserDefined>true</rd:UserDefined>
<DataField>LabelColumn</DataField>
</Field>
</Fields>
</DataSet>
<DataSet Name=""DataSetInteger"">
<Query>
<DataSourceName>DATABASE</DataSourceName>
<CommandType>StoredProcedure</CommandType>
<CommandText>dbo.integer_data</CommandText>
</Query>
<Fields>
<Field Name=""ValueColumn"">
<rd:UserDefined>true</rd:UserDefined>
<DataField>ValueColumn</DataField>
</Field>
<Field Name=""LabelColumn"">
<rd:UserDefined>true</rd:UserDefined>
<DataField>LabelColumn</DataField>
</Field>
</Fields>
</DataSet>
</DataSets>
<ReportSections>
<ReportSection>
<Body>
<ReportItems>
<Textbox Name=""Textbox1"">
<rd:DefaultName>Textbox1</rd:DefaultName>
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Join(Parameters!DataSetValuesParameterText.Label, "", "")</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<Top>0.155in</Top>
<Left>1.24875in</Left>
<Height>0.25in</Height>
<Width>1in</Width>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
<Textbox Name=""Textbox2"">
<rd:DefaultName>Textbox1</rd:DefaultName>
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Join(Parameters!DataSetValuesParameterInteger.Label, "", "")</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<Top>0.47444in</Top>
<Left>1.24875in</Left>
<Height>0.25in</Height>
<Width>1in</Width>
<ZIndex>1</ZIndex>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
<Textbox Name=""Textbox3"">
<rd:DefaultName>Textbox1</rd:DefaultName>
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Join(Parameters!ValidValuesParameterText.Label, "", "")</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<Top>0.155in</Top>
<Left>4.1875in</Left>
<Height>0.25in</Height>
<Width>1in</Width>
<ZIndex>2</ZIndex>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
<Textbox Name=""Textbox4"">
<rd:DefaultName>Textbox1</rd:DefaultName>
<CanGrow>true</CanGrow>
<KeepTogether>true</KeepTogether>
<Paragraphs>
<Paragraph>
<TextRuns>
<TextRun>
<Value>=Join(Parameters!ValidValuesParameterInteger.Label, "", "")</Value>
<Style />
</TextRun>
</TextRuns>
<Style />
</Paragraph>
</Paragraphs>
<Top>0.47444in</Top>
<Left>4.1875in</Left>
<Height>0.25in</Height>
<Width>1in</Width>
<ZIndex>3</ZIndex>
<Style>
<Border>
<Style>None</Style>
</Border>
<PaddingLeft>2pt</PaddingLeft>
<PaddingRight>2pt</PaddingRight>
<PaddingTop>2pt</PaddingTop>
<PaddingBottom>2pt</PaddingBottom>
</Style>
</Textbox>
</ReportItems>
<Height>2.25in</Height>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</Body>
<Width>6in</Width>
<Page>
<PageFooter>
<Height>0.45in</Height>
<PrintOnFirstPage>true</PrintOnFirstPage>
<PrintOnLastPage>true</PrintOnLastPage>
<Style>
<Border>
<Style>None</Style>
</Border>
</Style>
</PageFooter>
<LeftMargin>1in</LeftMargin>
<RightMargin>1in</RightMargin>
<TopMargin>1in</TopMargin>
<BottomMargin>1in</BottomMargin>
<Style />
</Page>
</ReportSection>
</ReportSections>
<ReportParameters>
<ReportParameter Name=""ValidValuesParameterText"">
<DataType>String</DataType>
<Prompt>ValidValuesParameterText</Prompt>
<ValidValues>
<ParameterValues>
<ParameterValue>
<Value>a</Value>
<Label>Label a</Label>
</ParameterValue>
<ParameterValue>
<Value>b</Value>
<Label>Label b</Label>
</ParameterValue>
<ParameterValue>
<Value>c</Value>
<Label>Label c</Label>
</ParameterValue>
</ParameterValues>
</ValidValues>
<MultiValue>true</MultiValue>
</ReportParameter>
<ReportParameter Name=""ValidValuesParameterInteger"">
<DataType>Integer</DataType>
<Prompt>ValidValuesParameterInteger</Prompt>
<ValidValues>
<ParameterValues>
<ParameterValue>
<Value>1</Value>
<Label>Label 1</Label>
</ParameterValue>
<ParameterValue>
<Value>2</Value>
<Label>Label 2</Label>
</ParameterValue>
<ParameterValue>
<Value>3</Value>
<Label>Label 3</Label>
</ParameterValue>
</ParameterValues>
</ValidValues>
<MultiValue>true</MultiValue>
</ReportParameter>
<ReportParameter Name=""DataSetValuesParameterText"">
<DataType>String</DataType>
<Prompt>DataSetValuesParameterText</Prompt>
<ValidValues>
<DataSetReference>
<DataSetName>DataSetText</DataSetName>
<ValueField>ValueColumn</ValueField>
<LabelField>LabelColumn</LabelField>
</DataSetReference>
</ValidValues>
<MultiValue>true</MultiValue>
</ReportParameter>
<ReportParameter Name=""DataSetValuesParameterInteger"">
<DataType>Integer</DataType>
<Prompt>DataSetValuesParameterInteger</Prompt>
<ValidValues>
<DataSetReference>
<DataSetName>DataSetInteger</DataSetName>
<ValueField>ValueColumn</ValueField>
<LabelField>LabelColumn</LabelField>
</DataSetReference>
</ValidValues>
<MultiValue>true</MultiValue>
</ReportParameter>
</ReportParameters>
<ReportParametersLayout>
<GridLayoutDefinition>
<NumberOfColumns>2</NumberOfColumns>
<NumberOfRows>2</NumberOfRows>
<CellDefinitions>
<CellDefinition>
<ColumnIndex>0</ColumnIndex>
<RowIndex>0</RowIndex>
<ParameterName>ValidValuesParameterText</ParameterName>
</CellDefinition>
<CellDefinition>
<ColumnIndex>1</ColumnIndex>
<RowIndex>0</RowIndex>
<ParameterName>ValidValuesParameterInteger</ParameterName>
</CellDefinition>
<CellDefinition>
<ColumnIndex>0</ColumnIndex>
<RowIndex>1</RowIndex>
<ParameterName>DataSetValuesParameterText</ParameterName>
</CellDefinition>
<CellDefinition>
<ColumnIndex>1</ColumnIndex>
<RowIndex>1</RowIndex>
<ParameterName>DataSetValuesParameterInteger</ParameterName>
</CellDefinition>
</CellDefinitions>
</GridLayoutDefinition>
</ReportParametersLayout>
</Report>
".Trim();
}
}
When the SSRS server expands expressions such as
Parameters!BeginDate.Labelthe rendering will provide the labels provided with the data regardless if the data is bound to a DataSet or the literal value(s) coming from valid values. If there are no labels, then the expression will display the value(s) as the values.https://learn.microsoft.com/en-us/sql/reporting-services/report-design/built-in-collections-parameters-collection-references-report-builder?view=sql-server-ver17
However in the nuget package up to the current version 15.1.33, any parameters which derive values from datasets, do not expand to labels correctly. These always default to the values passed instead which should be a fallback option and not the primary behavior. The Parameters should expand to using the label specified from the DataSet column specified before falling back to the parameter value.