sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan får du et OBJECT_NAME() fra en anden database i SQL Server

Hvis du nogensinde har brug for at bruge OBJECT_NAME() funktion til at hente et objekts navn fra en anden database i SQL Server, kan du løbe ind i problemer, hvis du ikke ved, hvordan det fungerer.

Du kender sikkert det OBJECT_NAME() accepterer en object_id argument, der fortæller SQL Server, hvilket objekt navnet skal hentes fra.

Hvad du måske ved eller måske ikke ved, er, at denne funktion også accepterer en valgfri database_id argument, der fortæller SQL Server, hvilken database object_id er tilhører.

Som standard antager SQL Server, at object_id er i sammenhæng med den aktuelle database. I dette tilfælde en forespørgsel, der refererer til et object_id i en anden database vil returnere NULL eller (endnu værre) forkerte resultater.

Eksempel 1 – Lokal forespørgsel (fra aktuel database)

For det første er her en lokal forespørgsel, der returnerer objektnavnet fra den aktuelle database:

BRUG musik;VÆLG navn SOM [Foreign Key], OBJECT_NAME(parent_object_id) AS [Parent Object Name], OBJECT_NAME(referenced_object_id) AS [Referenced Object Name]FRA Music.sys.foreign_keysWHERE name ='FK_Artists_Country';
>

Resultat:

Ændrede databasekontekst til 'Musik'.+-------------------------+------------------------ -----+---------------------------------+| Fremmednøgle | Overordnet objektnavn | Referenceobjektnavn ||---------------------+----------------------------+- --------------------------|| FK_Artists_Country | Kunstnere | Land |+---------------------+----------------------+--- -----------------------+(1 række påvirket)

Disse resultater er korrekte.

Dette er ikke en forespørgsel på tværs af databaser. Dette er blot et eksempel for at vise, hvordan denne funktion bruges, når et objekts navn hentes fra den aktuelle database.

Eksempel 2 – Forespørgsel på tværs af databaser med FORKERTE RESULTATER!

Her er en forespørgsel på tværs af databaser, der giver forkerte resultater.

BRUG WideWorldImportersDW;VÆLG navn SOM [Foreign Key], OBJECT_NAME(parent_object_id) AS [Parent Object Name], OBJECT_NAME(referenced_object_id) AS [Referenced Object Name]FRA Music.sys.foreign_keysWHERE name ='FK'Artists; 

Resultat:

Ændrede databasekontekst til 'WideWorldImportersDW'.+-------------------------+----------------- -----+------------------------------------+| Fremmednøgle | Overordnet objektnavn | Referenceobjektnavn ||---------------------+----------------------------+- ----------------------------|| FK_Artists_Country | CityKey | PK_Dimension_Payment_Method |+-------------------------+-----------------------------+--- --------------------------+(1 række påvirket)

Alt jeg gjorde var at skifte til en anden database og derefter køre den samme forespørgsel igen.

Du vil bemærke, at min FROM klausul bruger et tredelt navn for at angive navnet på databasen (Music ). Dette gør det muligt at finde den korrekte fremmednøgle. Dette er dog ikke nok til at forhindre problemer i at opstå.

Som det viser sig, er WideWorldImportersDW databasen har objekter med samme object_id der bruges i Music database. Det eneste problem er, at de er helt forskellige objekter med forskellige navne. Så resultaterne i de sidste to kolonner er falske. Dette er navnene på de forkerte objekter på den forkerte database. Min krydsdatabaseforespørgsel har fået krydset trådene og returneret de forkerte objekter!

Dette er særligt farligt, for hvis jeg ikke var opmærksom, kunne disse resultater se ud til at være OK. Jeg fik jo ikke en fejl.

Hvis disse objekt-id'er ikke fandtes i denne database, ville jeg sandsynligvis have fået en NULL-værdi (hvilket måske gør det nemmere at opdage, at der er noget galt med resultaterne).

Uanset hvad, er resultatet simpelthen forkert .

Eksempel 3 – Forespørgsel på tværs af databaser med KORREKTE resultater

For at rette det forrige eksempel (uden at ændre den aktuelle database), skal vi angive ID'et for den database, som vi vil have objektets navn fra.

Sådan:

BRUG WideWorldImportersDW;VÆLG navn SOM [Foreign Key], OBJECT_NAME(parent_object_id, 5) AS [Parent Object Name], OBJECT_NAME(referenced_object_id, 5) AS [Referenced Object Name]FRA Music.sys.foreign_keys_WHERE artist name ='FKry;

Resultat:

Ændrede databasekontekst til 'WideWorldImportersDW'.+-------------------------+----------------- -----+---------------------------------+| Fremmednøgle | Overordnet objektnavn | Referenceobjektnavn ||---------------------+----------------------------+- --------------------------|| FK_Artists_Country | Kunstnere | Land |+---------------------+----------------------+--- -----------------------+(1 række påvirket)

Igen, bare for at være klar, er den aktuelle database WideWorldImportersDW , men objekterne er på en anden database kaldet Music , som har et database-id på 5.

Eksempel 4 – Sådan får du database-id'et

Det er ret sandsynligt, at du ikke ved, hvad databasens id er fra toppen af ​​dit hoved. Du kender sikkert navnet på databasen, men ikke dens ID.

Heldigvis kan du bruge DB_ID() funktion til at returnere databasens ID, baseret på dens navn.

Derfor kan vi ændre det foregående eksempel som følger:

BRUG WideWorldImportersDW;VÆLG navn SOM [Foreign Key], OBJECT_NAME(parent_object_id, DB_ID('Music')) AS [Parent Object Name], OBJECT_NAME(referenced_object_id, DB_ID('Music')) AS [Referenced Object Name]FROM Music.sys.foreign_keysWHERE name ='FK_Artists_Country';

Resultat:

Ændrede databasekontekst til 'WideWorldImportersDW'.+-------------------------+----------------- -----+---------------------------------+| Fremmednøgle | Overordnet objektnavn | Referenceobjektnavn ||---------------------+----------------------------+- --------------------------|| FK_Artists_Country | Kunstnere | Land |+--------------------+----------------------+--- -----------------------+(1 række påvirket)

  1. DAY() Eksempler – MySQL

  2. Hvordan indstilles værdi til variabel ved hjælp af 'execute' i t-sql?

  3. Overvågning af tilgængelighed Gruppereplikasynkronisering

  4. Hvordan YEAR() virker i MariaDB