问题描述
我正在运行一个过程,以从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)
正在寻找一些建议。
解决方法
使用QUOTENAME
或REPLACE
安全地转义该值:
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,'''''')
)都将“加倍”到'
,因此可以安全地转义。