2013-03-25 3 views
0

I Have SSIS вариабельной экспрессией, как это,Substring на Variable выражение SSIS

@[System::PackageName]+","+  
@[System::SourceName]+","+  
(DT_STR,15,1252) @[System::ErrorCode]+","+  
@[System::ErrorDescription]+","+  
(RIGHT((DT_WSTR,4) 
DATEPART("yyyy",GetDate()),4)+"/"+  
RIGHT("0"+(DT_WSTR , 2) 
DATEPART("mm", GetDate()),2)+"/"+  
RIGHT("0"+(DT_WSTR,2) 
DATEPART("dd",GetDate()),2)+"_"+  
RIGHT("0"+(DT_WSTR,2) 
DATEPART("HH",GetDate()),2)+":"+  
RIGHT("0"+(DT_WSTR,2) 
DATEPART("MM",GetDate()),2)+":"+  
RIGHT("0"+(DT_WSTR,2) 
DATEPART("SS",GetDate()),2))+","+ 
@[System::MachineName] 

Теперь я хочу, чтобы получить строку из @[System::ErrorDescription] которая располагаемый перед at, вот образец значения @[System::ErrorDescription]

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.IO.DirectoryNotFoundException: Could not find a part of the path 'D:\blablablabl\yes.txt'. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize) at System.Xml.XmlDownloadManager.GetStream(Uri uri, ICredentials credentials) at System.Xml.XmlUrlResolver.GetEntity(Uri absoluteUri, String role, Type ofObjectToReturn) at System.Xml.XmlTextReaderImpl.OpenUrlDelegate(Object xmlResolver) at System.Threading.CompressedStack.runTryCode(Object userData) at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) at System.Threading.CompressedStack.Run(CompressedStack compressedStack, ContextCallback callback, Object state)

Что я сделал, это написать код подстроки в моих переменных выражениях:

SUBSTRING(@[System::ErrorDescription], 1, FINDSTRING(@[System::ErrorDescription], "at", 1)-1)+","+

но оно всегда дает мне ошибку, что значение подстроки не может быть отрицательным, что не так с моим кодом?

+0

Похоже, вы идете на большие расстояния, чтобы зафиксировать ошибку и увеличить количество ошибок в этом процессе. Любая причина, по которой вы не хотите использовать встроенную запись ошибок? –

ответ

0

Если результат FINDSTRING(@[System::ErrorDescription], "at", 1) равен нулю (т. Е. Строка не найдена), то последний параметр для выражения подстроки будет -1. Это обычная проблема.

Возможно, вы можете попробовать оценить, равна нулю, и использовать только FindString, если это не так. Для ясности я разделил выражение ниже, но все должно быть на одной строке. У меня нет SSIS для тестирования, но посмотрите, работает ли он.

Я не думаю, что вы разместили свое полное выражение, но это должно дать вам эту идею.

FINDSTRING(@[System::ErrorDescription], "at", 1)==0 
    ? 
"Nothing Found" 
    : 
SUBSTRING(
    @[System::ErrorDescription], 
    1, 
    FINDSTRING(@[System::ErrorDescription], "at", 1)-1 
) 

Вот ссылка, которая описывает условное:

http://msdn.microsoft.com/en-us/library/ms141680.aspx

Я не уверен, что это полная история, но попробовать его, и он будет вымывать ваш следующий вопрос.

+0

Я уже изменяю значение, но оно дает мне отличную ошибку, поэтому, если я хочу удалить строку после, какое выражение я должен использовать ..? – Sabilv

Смежные вопросы