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?
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.