Я использовал PATINDEX
для сопоставления с первым и последним числом во входной строке, а затем использовал SUBSTRING
для извлечения числовой части
DECLARE @input VARCHAR(100);
DECLARE @temp VARCHAR(100);
DECLARE @first int;
DECLARE @last int;
SET @input ='حساب-س1-96658-305-651ساير سپرده ها'
SET @first = PATINDEX( '%[0-9]%',@input);
SET @last = PATINDEX('%[0-9]%', REVERSE(@input));
SET @temp = SUBSTRING(@input, @first, LEN(@input));
SELECT SUBSTRING(@temp, 1, @last + 2)
Это выводит 1-96658-305-651
в моем клиенте, так что вы Возможно, придется сделать REVERSE для результата, так как я немного запутался в том, как мой клиент обрабатывает арабские символы. Хотелось бы надеяться, что это поможет вам достаточно близко выяснить последние детали.
Я думаю, что нашел решение Вашей проблемы в краткой информации Primary Interop Assemblies Microsoft. PIAs обрабатываются по-другому в Visual Studio:
Когда пользователь пытается добавить ссылку на библиотеку типов, которая имеет зарегистрированный PIA, Visual Studio будет тихо использовать зарегистрированный PIA вместо того, чтобы повторно импортировать библиотеку типов с Tlbimp. Это гарантирует, что PIA используется, когда это возможно.
Это означает, что, когда Вы добавляете ссылку на свой собственный IA к проекту, Visual Studio проверит, существует ли PIA, зарегистрированный для этого COM-объекта. PIAs Outlook регистрируются под следующим ключом:
HKEY_CLASSES_ROOT\CLSID\{0006F023-0000-0000-C000-000000000046}\InprocServer32\12.0.0.0
Assembly="Microsoft.Office.Interop.Outlook, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71E9BCE111E9429C"
Из того, что я понимаю нерегистрацию PIA, использование regasm инструмента должно удалить ключ и передобавление, что ссылка на Ваш собственный IA должна дать ожидаемый результат.
Однако Microsoft не рекомендует использовать пользовательские МСФО, если существует доступное PIA. Я не понимаю точной причины этого, но я предполагаю, что это могло бы быть связано с маршалингом оптимизации и наличием уникальных определений типа.