AD is beperkt voor het verzenden van 1000 records in een batch. In een ADO interface kun je hier een batch grote voor definieren,
in OPENQUERY kan dit niet. Omdat deze beperking bestaat werken we ons maar een weg door het alfabet middels een "while" lus.
ALTER PROCEDURE [dbo].[SPName]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @cmdstr char(800)
DECLARE @eindstr Char(800)
DECLARE @nAsciiValue smallint
DECLARE @sChar char(1)
truncate table <TableName>
-- Begin Select 65 = 'a' t/m 'z'
SELECT @nAsciiValue = 65
WHILE @nAsciiValue < 91
BEGIN
SELECT @sChar= CHAR(@nAsciiValue)set @cmdstr = 'SELECT * from openquery (ADSI,''select displayname,physicalDeliveryOfficeName,
initials,department,company,employeeID,homeDirectory,profilePath,distinguishedName,title,
sAMAccountName,givenName,telephoneNumber,
sn,mail,userAccountControl,homemta from
''''LDAP://server.domain.ad/DC=<domain>,DC=ad'''' WHERE objectclass=''''person'''' AND SAMAccountName = ''''%s*'''''')'
select @eindstr = dbo.fnSprintf(@cmdstr, @schar, default)
-- Vullen tabel
INSERT <tablename>
EXEC( @eindstr )
SELECT @nAsciiValue = @nAsciiValue + 1
END
De functie fnSprintf heb ik van internet gehaald en vervangt de standaardfunctie xp_sprintf die een beperking heeft van 255 karakters. De functie fnSprintf kan hier 8000 karakters verwerken.
--=========================================================================
-- Made by Ryan Randall @ http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65584
-- Gebruiken van de Functie gaat op de volgende manier:
-- select dbo.fnSprintf('INSERT INTO %s VALUES (%s, %s)', 'table1,1,2', default)
-- Functie wordt aangeroepen vanuit de SP: [SP_Name]
--=========================================================================
ALTER function [dbo].[fnSprintf] (@s varchar(8000), @params varchar(8000), @separator char(1) = ',')
returns varchar(8000)
as
begin
declare @p varchar(8000)
set @params = @params + @separator
while not @params = ''
begin
set @p = left(@params+@separator, charindex(@separator, @params)-1)
set @s = STUFF(@s, charindex('%s', @s), 2, @p)
set @params = substring(@params, len(@p)+2, 8000)
end
return @s
end
Laatst aangepast op Donderdag 23 September 2010 08:05
Geschreven door Bob Tossaint
Maandag 14 April 2008 10:15