2015-04-17 3 views
0

SSRS ненавижу меня. Прямо сейчас, чувство взаимно.SSRS: конкатенация строк с нулевыми строками

Я пытаюсь работать со строками, которые могут быть или не быть нулевыми. Я использовал инструкцию VB IIF; после некоторого поиска ошибок, которые я получал, я обнаружил, что оператор IIF не замыкается так, как вы ожидали бы, если бы выполнялись инструкции. Я исправил проблему, изменив операторы IIF на If. Думали, что все было хорошо.

До тех пор, пока я не столкнулся с проблемой here.

Так что я застрял. Я попытался поместить все в кодовом блоке отчета, думая, что я мог бы изолировать себя от проблем, я бегу в, например, так:

Public Function DisplayUserName(ByVal UserName As String, ByVal FirstName As String, ByVal MiddleName As String, ByVal LastName As String) As String 
    'SSRS sucks. Specifically, with empty strings and if statements that aren't IIF. Hence the code block. 
    'See https://stackoverflow.com/q/27418185/677526. Unfortunately IIF can't work here. 
    Dim result As New System.Text.StringBuilder() 

    If Not System.String.IsNullOrWhitespace(UserName) Then 
     result.Append(UserName) 
     result.Append(VbCrLf) 
    End If 

    If Not System.String.IsNullOrWhitespace(FirstName) Then 
     result.Append(FirstName) 
     result.Append(" ") 
    End If 

    If Not System.String.IsNullOrWhitespace(MiddleName) Then 
     result.Append(GetChar(MiddleName, 1)) 
     result.Append(". ") 
    End If 

    If Not System.String.IsNullOrWhitespace(LastName) Then 
     result.Append(LastName) 
    End If 

    Return result.ToString() 
End Function 

... но теперь я бегу в проблемы с IsNullOrWhitespace не является членом System.String.

Я почти потерял здесь, так как я борюсь со своими инструментами. Кто-нибудь сталкивался с этим раньше, пытаясь объединить группу строк, которая может быть нулевой? Как вы решили проблему? Следует отметить, что я могу сделать это в нашем SQL-запросе (и я почти готов отказаться и сказать что угодно), но конкатенация строк, похоже, несколько замедляет запрос.

+0

Почему вы не построить строку в вашем SQL? –

+0

@TabAlleman «Заметьте, я могу сделать это в нашем SQL-запросе (и я почти готов отказаться и сказать что угодно), но конкатенация строк, похоже, несколько замедляет запрос». –

ответ

0

установить подходящую версию для .net в проекте - для более ранней версии она не поддерживается.

.NET Framework Поддерживается в версиях: 4.5.2, 4.5.1, 4.5, 4

.NET Framework Client Profile Поддерживается в версиях: 4

Portable Class Library Поддерживается в версиях: Портативный библиотеки классов

.NET для Windows Store приложений Поддерживается в версиях: Windows 8

.NET для телефонных приложений для Windows Поддерживается в: Windows Phone 8.1, Windows Phone 8, Silverlight 8.1

+0

Вот оно. К сожалению, SSRS не поддерживает более новые версии .NET и, следовательно, является устаревшим приложением. –

0

Обычно возникают проблемы, связанные с конкатенацией строк со значениями NULL в SSRS. Специально после сеансов UAT в результате наличия пустых ячеек в отчетах, в то время как в базе данных есть данные. Существуют различные подходы к решению этой проблемы. Я перечислим подходы, выберите «Мой любимый» и изложите свои рассуждения.

Подход 1: Использование

SET CONCAT_NULL_YIELDS_NULL { ON | OFF } 

настройки. который контролирует, считаются ли результаты конкатенации нулевыми или пустыми строковыми значениями. Изменяя настройки в положение OFF

SET CONCAT_NULL_YIELDS_NULL OFF; 

Вы можете сцепить значение строки с нулевым или пустым значением и возвращает значение, отличное от NULL, если есть значение строки в любом из полей, которые вы используете для конкатенации.

Подход 2: Используя условные выражения, мы можем использовать условия IF или случаи, чтобы проверить, является ли значение поля, которое будет использоваться в запросе конкатенации, Null или нет.Следовательно, мы можем также присвоить строковое значение этой конкретной ячейке, которая будет конкатенирована, если условие окажется истинным.

Подход 3: Использование системных функций, таких как ISNULL() и COALESCE().

ISNULL (check_expression , replacement_value) 
COALESCE (expression [ ,...n ]) 

MY PICK СОАЬЕЗСЕ() ОБОСНОВАНИЕ СЛЕДУЮЩИМ
1- Даже если изменение параметра является easies и наиболее экономически эффективным подходом. В большинстве компаний разработчику не нужно изменять настройки или изменения, внесенные вами в объекты tsql, могут быть даже отменены с помощью системного администратора с более высокими привилегиями. 2- Даже если вы получите одобрение, Microsoft объявила, что эта функция будет установлена ​​на «ON» только в будущих обновлениях, в результате не рекомендуется ретранслировать эту настройку. проверьте ссылку https://msdn.microsoft.com/en-us/library/ms176056.aspx 3-зачем писать пользовательский код, когда системная функция может выполнять задание 4- Я предпочитаю обертывать каждое поле COALESCE(), чем ISNULL(), потому что он гибкий, чтобы добавить n количество полей для сравнения.

пример

SELECT 
EgField1, 
EgField2, 
COALESCE(Person.FName,'FNameNotAvialable') +  
COALESCE(Person.LName,'LNameNotAvialable') AS [FULL NAME] 
FROM Person.Person 
Смежные вопросы