Whi*_*ang 5 sql sql-server sql-server-2008
当我尝试为用户查询 AD 时,我收到以下错误:
无法从链接服务器“ADSI”的 OLE DB 提供程序“ADsDSOObject”中获取一行。
我假设问题是由于 1000 行限制(或 SqlServer 2008 中的 901 行)。我可以分页查询,但我正在寻找可以让我一次检索 1000 多个的解决方法。
如果有帮助,我正在使用 SqlServer 2008 R2。这是我的查询
SELECT samaccountname AS Account, ISNULL(givenName, '''') AS givenName, ISNULL(SN, '''') AS SN, ISNULL(DisplayName, '''') as DisplayName, ISNULL(Title, '''') AS Title
FROM OpenQuery(ADSI,
'SELECT SamAccountName, givenName, SN, DisplayName, Title
FROM ''LDAP://corpdomain.corp''
WHERE objectClass = ''User'' and (SN = ''*'' or givenName = ''*'')')
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑 - 经过进一步检查,我意识到我也无法正确分页此查询。有没有人对可以让我分页结果的解决方案或可以让我返回超过 901 的解决方法有任何提示?
小智 6
我也遇到了这个问题,并且不喜欢按帐户名的第一个字母发布分页的通常解决方案。这意味着对 AD 进行 26 次单独调用,并且仍然可能会失败,因为对于大型域,很可能有 901 个以上的帐户以相同的第一个字母开头 - 特别是如果您正在查看计算机帐户,这些帐户可能遵循一些系统性命名约定使用相同的第一个字母...
我做了一些尝试,我发现如果你通过 uSNCreated 订购 openquery 并在外部查询上放置一个 TOP 901 子句,它不会爆炸。
所以,这是我的 SQL,它将所有活动目录对象(计算机、域控制器、用户和联系人)以 901 条记录的块状提取到临时表中,并为您提供有关每个对象的一些有用信息。
CREATE TABLE #ADData(
Login NVARCHAR(256)
,CommonName NVARCHAR(256)
,GivenName NVARCHAR(256)
,FamilyName NVARCHAR(256)
,DisplayName NVARCHAR(256)
,Title NVARCHAR(256)
,Department NVARCHAR(256)
,Location NVARCHAR(256)
,Info NVARCHAR(256)
,LastLogin BIGINT
,flags INT
,Email NVARCHAR(256)
,Phone NVARCHAR(256)
,Mobile NVARCHAR(256)
,Quickdial NVARCHAR(256)
, usnCreated INT
)
DECLARE @Query VARCHAR (2000)
DECLARE @Filter VARCHAR(200)
DECLARE @Rowcount INT
select @Filter =''
WHILE ISNULL(@rowcount,901) = 901 BEGIN
SELECT @Query = '
SELECT top 901
Login = SamAccountName
, CommonName = cn
, GivenName
, FamilyName = sn
, DisplayName
, Title
, Department
, Location = physicalDeliveryOfficeName
, Info
, LastLogin = CAST(LastLogon AS bigint)
, flags = CAST (UserAccountControl as int)
, Email = mail
, Phone = telephoneNumber
, Mobile = mobile
, QuickDial = Pager
, usnCreated
FROM OPENROWSET(''ADSDSOObject'', '''', ''
SELECT cn, givenName, sn, userAccountControl, lastLogon, displayName, samaccountname,
title, department, physicalDeliveryOfficeName, info, mail, telephoneNumber, mobile, pager, usncreated
FROM ''''LDAP://[ldap-query-string]''''
WHERE objectClass=''''Person''''
AND objectClass = ''''User''''
' + @filter + '
ORDER BY usnCreated'')'
INSERT INTO #ADData EXEC (@Query)
SELECT @Rowcount = @@ROWCOUNT
SELECT @Filter = 'and usnCreated > '+ LTRIM(STR((SELECT MAX(usnCreated) FROM #ADData)))
END
SELECT LOGIN
, CommonName
, GivenName
, FamilyName
, DisplayName
, Title
, Department
, Location
, Email
, Phone
, QuickDial
, Mobile
, Info
, Disabled = CASE WHEN CAST (flags AS INT) & 2 > 0 THEN 'Y' ELSE NULL END
, Locked = CASE WHEN CAST (flags AS INT) & 16 > 0 THEN 'Y' ELSE NULL END
, NoPwdExpiry = CASE WHEN CAST (flags AS INT) & 65536 > 0 THEN 'Y' ELSE NULL END
, LastLogin = CASE WHEN ISNULL(CAST (LastLogin AS BIGINT),0) = 0 THEN NULL ELSE
DATEADD(ms, (CAST (LastLogin AS BIGINT) / CAST(10000 AS BIGINT)) % 86400000,
DATEADD(day, CAST (LastLogin AS BIGINT) / CAST(864000000000 AS BIGINT) - 109207, 0)) END
, Type = CASE WHEN flags & 512 = 512 THEN 'user'
WHEN flags IS NULL THEN 'contact'
WHEN flags & 4096 = 4096 THEN 'computer'
WHEN flags & 532480 = 532480 THEN 'computer (DC)' END
FROM #ADData
ORDER BY Login
DROP TABLE #ADData
Run Code Online (Sandbox Code Playgroud)
当我尝试为用户查询 AD 时,我收到以下错误:
无法从链接服务器“ADSI”的 OLE DB 提供程序“ADsDSOObject”中获取一行。
我假设问题是由于 1000 行限制(或 SqlServer 2008 中的 901 行)。我可以分页查询 > 但我正在寻找允许我一次检索 1000 多个的解决方法。
如果有帮助,我正在使用 SqlServer 2008 R2。这是我的查询 >
SELECT samaccountname AS Account, ISNULL(givenName, '''') AS givenName, ISNULL(SN, '''') AS SN, ISNULL(DisplayName, '''') as DisplayName, ISNULL(Title, '''') AS Title
FROM OpenQuery(ADSI,
'SELECT SamAccountName, givenName, SN, DisplayName, Title
FROM ''LDAP://corpdomain.corp''
WHERE objectClass = ''User'' and (SN = ''*'' or givenName = ''*''
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑 - 经过进一步检查,我意识到我也无法正确分页此查询。> 是否有人对允许我对结果进行分页的解决方案或解决方法有任何提示 > 允许我返回超过 901?
我刚刚解决了我面临的同样问题,通过优化应用分页(并且我成功地能够从 AD 检索大约 50k 登录,并且不会丢失从 AD 域获取单个登录帐户):
您需要通过遍历属性的字符来解决 ADSI 查询限制。在此处查看解决方案:http : //www.sqlservercentral.com/Forums/Topic231658-54-1.aspx#bm1249991
通过编写SELECT TOP 901 ...IN PLACE OF JUST解决了错误SELECT。
是的,这个问题与使用 SqlServer 2008 R2 有关。这个问题是我从 2005 年迁移到 2008 年数据库后出现的,因为在 SQL Server 2008 中,有 901 行的限制,而在 SQL Server 2005 中是 1000(不同的是我们需要写 select TOP 901,这不是SQL Server 2005 中需要,否则程序将失败并显示错误)
| 归档时间: |
|
| 查看次数: |
59550 次 |
| 最近记录: |