Я вижу много неправильных ответов здесь. Любое правильное решение должно проигнорировать пробел и пунктуацию (и любые небуквенные символы на самом деле) и должно быть нечувствительным к регистру.
Несколько хороших тестовых сценариев в качестве примера:
"Человек, план, канал, Панама. "
"Тойота Тойота".
""
, А также некоторые непалиндромы.
решение В качестве примера в C# (примечание: пустые и пустые строки считают палиндромами в этом дизайне, если это не желаемо, чтобы было легко измениться):
public static bool IsPalindrome(string palindromeCandidate)
{
if (string.IsNullOrEmpty(palindromeCandidate))
{
return true;
}
Regex nonAlphaChars = new Regex("[^a-z0-9]");
string alphaOnlyCandidate = nonAlphaChars.Replace(palindromeCandidate.ToLower(), "");
if (string.IsNullOrEmpty(alphaOnlyCandidate))
{
return true;
}
int leftIndex = 0;
int rightIndex = alphaOnlyCandidate.Length - 1;
while (rightIndex > leftIndex)
{
if (alphaOnlyCandidate[leftIndex] != alphaOnlyCandidate[rightIndex])
{
return false;
}
leftIndex++;
rightIndex--;
}
return true;
}
Я думаю, что это одно из ограничений интерфейса AD на основе T-SQL - вы не можете получать многозначные атрибуты, например атрибуты (например, memberOf
для пользователя) которые содержат более одного значения.
Вы можете получить однозначные атрибуты, такие как «sn» (surname = last name) или «givenName» и «mail» и т. д., но интерфейс на основе SQL не способен обрабатывать такие атрибуты, как "memberOf" с несколькими присвоенными им значениями.
Поэтому я боюсь, что вам придется пойти другим путем для этой проблемы - например, найти и заполнить членство в группе в управляемом коде (отдельно вне SQL Server или, возможно, как сборка CLR внутри SQL Server).
ОБНОВЛЕНИЕ: см. здесь (поддержка MSDN) для объяснения ограничений провайдера OPENQUERY AD:
Ограничения
Процесс использования Оператор OPENQUERY для вытягивания информация с сервера LDAP делает страдают некоторыми ограничениями. В ограничения можно обойти в в одних случаях, но в других дизайн приложения необходимо изменить. An внешнее приложение или COM-объект который использует ADSI для получения информация с сервера LDAP и затем создайте таблицу в SQL с помощью ADO или другие методы доступа к данным еще один жизнеспособный метод.Первое ограничение - , что многозначные свойства не могут возвращаться в результирующем наборе для SQL Сервер. ADSI будет читать схему информация с сервера LDAP, которая определяет структуру и синтаксис классы и атрибуты, используемые сервер. Если атрибут запрашивается с сервера LDAP определен в схеме как многозначный не может быть возвращен в оператор OPENQUERY.
Microsoft Technet Script Center - отличный ресурс для скриптов
http://technet.microsoft.com/en-us/scriptcenter/default.aspx
Вот сценарий, который утверждает, что выдаёт именно то, что вы хотите:
http://gallery.technet.microsoft.com/ScriptCenter/en-us/ab5400e2-489a-4738-9b85-508bcb5b75f8
Этого можно добиться, выбрав все группы, которые содержат пользователя в своем атрибуте члена или, что лучше, путь LDAP пользователя (различающееся имя). Вот простая процедура, выполняющая эту работу.
CREATE PROCEDURE dbo.GetLdapUserGroups
(
@LdapUsername NVARCHAR(256)
)
AS
BEGIN
DECLARE @Query NVARCHAR(1024), @Path NVARCHAR(1024)
SET @Query = '
SELECT @Path = distinguishedName
FROM OPENQUERY(ADSI, ''
SELECT distinguishedName
FROM ''''LDAP://DC=domain,DC=com''''
WHERE
objectClass = ''''user'''' AND
sAMAccountName = ''''' + @LdapUsername + '''''
'')
'
EXEC SP_EXECUTESQL @Query, N'@Path NVARCHAR(1024) OUTPUT', @Path = @Path OUTPUT
SET @Query = '
SELECT name AS LdapGroup
FROM OPENQUERY(ADSI,''
SELECT name
FROM ''''LDAP://DC=domain,DC=com''''
WHERE
objectClass=''''group'''' AND
member=''''' + @Path + '''''
'')
ORDER BY name
'
EXEC SP_EXECUTESQL @Query
END
- Гильберт