私もこの問題をヒットし、アカウント名の最初の文字によってページングの投稿いつものソリューションを好きではなかったです。これは、ADへの26回の別々の呼び出しを意味し、大きなドメインでは同じ最初の文字から始まるアカウントが901を超える可能性が非常に高いため、特に失敗する可能性があります。同じ最初の手紙を使用している命名規則...
私はあなたがuSNCreatedによってopenqueryを注文し、外側のクエリにTOP 901節を置くと、それが爆発しないことを発見しました。
ここでは、すべてのアクティブなディレクトリオブジェクト(コンピュータ、ドメインコントローラ、ユーザー、連絡先)を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
このデータの最終目標は何ですか。最良の解決策は、このようにしないことです。たとえば、ある種類のシステムではこのタイプの問合せの問題を解決しました。あるケースではSSISパッケージに置き換え、もう1つのケースではSSRSでADに直接移動するレポート・データ・ソースを使用します。 – JamieSee
ジェームズありがとう、私は最終目標を再評価し、より良い方法を見つけました。アプリケーションの目的でADユーザに属性を追加したかったので、バッチジョブを使用してADユーザを抽出してDBに格納するだけです。 – SDeezy
[Retrieve> 901行のSQL Server 2008リンクサーバーからActive Directoryへの複製](http://stackoverflow.com/questions/5661371/retrieve-901-rows-from-sql-server-2008-linked-server-アクティブディレクトリからアクティブディレクトリへ) –