webForumDet fria alternativet

Hämta användardata från annan server

Databaser & SQL

2 svar · 536 visningar · startad av ironhead

Medlem sedan mars 20011 346 inlägg
Frågan#1

Hej!

Jag vill hämta data från ett flertal databaser (MSSQL2000 & 2005).
Det jag får problem med är att den enda gemensamma mellan dessa användare är användarnamn & lösenord.

Först skapar jag en temptabell med allt utom adressuppgifter som finns på en helt annan server ex:

CREATE Table #tempTbl(
	UserID int,
	User varchar(50),
	Pass varchar(50),
	Address varchar(500)
             )

INSERT INTO #tempTbl
	(
	 UserID,
	 User,
	 Pass
	)
	Select userID, User, Pass FROM Users

Nu vill jag uppdatera denna temptabell med adressuppgifterna från en annan databas-server.

UPDATE #tempTbl
             SET
	Address = (SELECT top 1 delivery_address FROM  
OPENDATASOURCE('SQLOLEDB','Data Source=192.168.x.x;User ID=xx;Password=xx').UserSettings.dbo.Users 
WHERE companyID = 3 
AND (user_name IN (SELECT User FROM #tempTbl) AND passw IN (SELECT Pass FROM #tempTbl)))

Detta funkar ju inte då jag inte vet hur jag ska få urskiljningen av användardatat från temp-tabellen...nu kollar den ju bara om användaren finns i temptabellen och uppdaterar första bästa värdet.

Ett problem till är att det kan finnas flera användare med samma användarnamn och lösenord från adress-databasen, men jag vill bara hämta den första adressen som den hittar (därav min illustration av TOP 1 :-/)

Hur ska jag skiva för att kunna matcha användaren med adressuppgifterna för respektive användare?

Alternativt: Kan man göra en join mellan flera olika tabeller i olika databaser och med tabeller/databaser på andra servrar?

Medlem sedan mars 20011 346 inlägg
#2

Snart i mål...

Jag har kommit fram till denna koden...och den fungerar, adressuppgifterna hamnar för respektive användare

DECLARE @Temp TABLE(UserID int, User varchar(50), Pass varchar(50), address varchar(500))
 
INSERT n@Temp(UserID, User, Pass)
Select UserID, User, Pass FROM Users

UPDATE @Temp
SET address = a.maxrows
FROM DBUsers a 
INNER JOIN DBUseraccess c
ON a.user_number = c.user_number 
INNER JOIN @Temp b
ON b.User = a.User_name 
AND b.Pass = a.pass

...men hur ska man skriva när det gäller data från en annan databasserver? (MSSQL2005)

testade med:

UPDATE @Temp
SET address = c.address
FROM OPENDATASOURCE('SQLOLEDB','Data Source=192.168.x.x;User ID=xx;Password=xx').xx.dbo.sUsers c
INNER JOIN @Temp b
ON b.User = c.user_name
AND b.Pass = c.pass

men det ville inte fungera utan fick detta felmeddelande:

Server: Msg 7202, Level 11, State 2, Line 20
Could not find server '"xx"."dbo"."sUsers"' in sysservers. Execute sp_addlinkedserver to add the server to sysservers.

Vad betyder det? Hur ska man egentligen skriva?

Medlem sedan mars 20011 346 inlägg
#3

Löste det genom att "länka" dbservern

EXEC    sp_addlinkedserver
          @server = '[Alias du vill använda]',
          @srvproduct = 'SQLServer OLEDB Provider',
          @provider = 'SQLOLEDB',
          @datasrc = '[namn på fysisk db-server]'

UPDATE @Temp
SET address = c.address
[alias].[db].dbo.sUsers c
INNER JOIN @Temp b
ON b.user = c.user_name
AND b.pass = c.pass
268 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
128 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)