【问题标题】:SSRS. Extra space between FirstName and LastNameSSRS。 FirstName 和 LastName 之间的额外空格
【发布时间】:2015-12-10 15:32:11
【问题描述】:

我的报告显示姓名(FirstName MiddleName LastName)。每个字段之间都有一个空格,并且当名称具有 MiddleName 时效果很好。但是,当 MiddleName 为 NULL 时,FirstName 和 LastName 之间会出现空格。解决该问题的最佳方法是什么? 我尝试了类似的方法:

=Fields!FirstName.Value & "" & iif (isNothing(Fields!MiddleName.Value), "", Fields!MiddleName.Value) & "" & Fields!LastName.Value

【问题讨论】:

    标签: reporting-services ssrs-2008 report ssrs-2012


    【解决方案1】:

    对于您当前的表达式,不应有空格。如果当前有任何空格,它们必须存在于您的数据库中...这可以通过在 FirstName、MiddleName、LastName 上使用 TRIM 来确认。

    要正确格式化您的字符串,您需要在"" 之间使用空格,并确保中间名后面的空格包含在 iif 语句中

    =TRIM(Fields!FirstName.Value) & " " & 
     iif (isNothing(TRIM(Fields!MiddleName.Value)), 
         "", 
         TRIM(Fields!MiddleName.Value) & " ")  
     & TRIM(Fields!LastName.Value)
    

    【讨论】:

      【解决方案2】:

      首先,您上面的表达式不返回带空格的名称。

      我认为你的意思是这样的空间:

      =Fields!FirstName.Value & " " & iif (isNothing(Fields!MiddleName.Value), " ", Fields!MiddleName.Value) & " " & Fields!LastName.Value
      

      除了 Jonnus 的答案,您还可以使用 'Len' 来检查它的长度。

      如果您只担心 MiddleName,您可以使用 Len 来使用此表达式

      =Fields!FirstName.Value & " " & IIF(Len(Fields!MiddleName.Value) < 1,"", Fields!MiddleName.Value) & " " & Fields!LastName.Value
      

      但如果我是你,我宁愿使用 sql 函数来处理这个问题,而不是用凌乱的表达式来处理。而且我还可以将它重用于其他报告,而不是再次重复该表达式。

      这是一个函数示例,它返回一个全名和你的格式的中间名。

      IF EXISTS (
        SELECT * 
        FROM dbo.sysobjects 
        WHERE ID = OBJECT_ID(N'[dbo].[GetClientFullNameWithMiddleName]') AND 
              xtype in (N'FN', N'IF', N'TF'))
      DROP FUNCTION [dbo].[GetClientFullNameWithMiddleName]
      
      GO
      
      CREATE FUNCTION [dbo].[GetClientFullNameWithMiddleName](@ClientID UNIQUEIDENTIFIER)
      RETURNS NVARCHAR(MAX) 
      AS
      BEGIN
      DECLARE @FULLNAME NVARCHAR(MAX)
      DECLARE @LASTNAME NVARCHAR(MAX)
      DECLARE @FIRSTNAME NVARCHAR(MAX)
      DECLARE @MIDDLENAME NVARCHAR(MAX)
      
      SET @LASTNAME = ISNULL((SELECT Lastname FROM Client WHERE ClientID = @ClientID),'')
      SET @FIRSTNAME = ISNULL((SELECT Firstname FROM Client WHERE ClientID = @ClientID),'')
      SET @MIDDLENAME = ISNULL((SELECT Middlename FROM Client WHERE ClientID = @ClientID),'')
      
      IF(@ClientID <> '00000000-0000-0000-0000-000000000000')
      BEGIN
              IF(@FIRSTNAME <> '')
                  BEGIN
                      SET @FULLNAME = CAST((@FIRSTNAME) AS NVARCHAR(MAX))
                      IF(@MIDDLENAME <> '' AND @FULLNAME <> '')
                      BEGIN
                          SET @FULLNAME = CAST((@FULLNAME + ' ' + @MIDDLENAME) AS NVARCHAR(MAX))
                      END
                      IF(@LASTNAME <> '' AND @FULLNAME <> '')
                      BEGIN 
                          SET @FULLNAME = CAST((@FULLNAME + ' ' + @LASTNAME) AS NVARCHAR(MAX))
                      END
                  END
              ELSE
                  BEGIN
                      SET @FULLNAME = CAST((@FIRSTNAME)AS NVARCHAR(MAX))
                  END
      END
      ELSE
      BEGIN
          SET @FULLNAME = ''
      END
      
      RETURN @FULLNAME
      
      END 
      
      GO
      

      那么你可以这样使用它

      SELECT 
      [dbo].[GetClientFullNameWithMiddleInitial](ClientID)
      FROM Client
      

      【讨论】: