LDAP专有名称在MSSQL中包含撇号

问题描述

我正在运行一个过程,以从LDAP获取用户的安全组。 我正在使用LDAP_MATCHING_RULE_IN_CHAIN检查DN是否为成员。 这是我的查询

SET @Query = '
    SELECT cn,AdsPath
    FROM OPENQUERY (ADSI,''<'+@adspath+'>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=' +@Path+'));cn,adspath;subtree'')'

EXEC SP_EXECUTEsql @Query

@path包含一个DN:CN = Jim O'Brien,OU =托管,OU =帐户,DC = willeke,DC = com

我运行过程时出错: “布莱恩”附近的语法不正确。 字符串')'后面的引号引起来。

该过程成功为其他用户执行。对于专有名称中的单引号,我只有问题。

我知道我是否使用替换功能删除在我比较值时双方的撇号,它将起作用。但是如何在LHS上使用它(即:会员:1.2.840.113556.1.4.1941)

正在寻找一些建议。

解决方法

使用QUOTENAMEREPLACE安全地转义该值:

SET @Query = '
    SELECT cn,AdsPath
    FROM OPENQUERY (ADSI,''<'+REPLACE(@adspath,'''','''''')+'>;(&(objectClass=group)(member:1.2.840.113556.1.4.1941:=' +REPLACE(@Path,'''''')+'));cn,adspath;subtree'')'

EXEC sys.sp_executesql @Query;

考虑到您不是在此处将值用单引号(')括起来,那么REPLACE似乎是更好的选择。


编辑,由于OP难以读取整行,我假设由于水平滚动条的缘故,请注意,我使用REPLACE转义了两个变量:{{1} } +REPLACE(@adspath,'''''')。这意味着任何单引号(REPLACE(@Path,''''''))都将“加倍”到',因此可以安全地转义。