SQL Server Linked Server Voorbeeld Query

Terwijl ik in Management Studio ben, probeer ik een query uit te voeren/een join uit te voeren tussen twee gekoppelde servers.
Is dit een correcte syntaxis bij gebruik van gekoppelde db-servers:

select foo.id 
from databaseserver1.db1.table1 foo, 
     databaseserver2.db1.table1 bar 
where foo.name=bar.name

Kortom, voeg je gewoon de db-servernaam toe aan de db.table ?


Antwoord 1, autoriteit 100%

Het formaat zou waarschijnlijk moeten zijn:

<server>.<database>.<schema>.<table>

Bijvoorbeeld:
DatabaseServer1.db1.dbo.table1


Update: ik weet dat dit een oude vraag is en het antwoord dat ik heb is correct; ik denk echter dat iedereen die hierover struikelt, een paar dingen moet weten.

Met name, wanneer een query wordt uitgevoerd op een gekoppelde server in een join-situatie, zal de GEHELEtabel van de gekoppelde server waarschijnlijkworden gedownload naar de server waarvan de query wordt uitgevoerd in volgorde om de join-operatie uit te voeren. In het geval van het OP zullen zowel table1van DB1als table1van DB2in hun geheel naar de server worden overgebracht het uitvoeren van de query, vermoedelijk met de naam DB3.

Als je grote tabellen hebt, kan dit kanresulteren in een bewerking die lang duurt om uit te voeren. Per slot van rekening wordt het nu beperkt door snelheden van netwerkverkeer, die orden van grootte langzamer zijn dan geheugen- of zelfs schijfoverdrachtssnelheden.

Voer indien mogelijk een enkele query uit op de externe server, zonder lid te worden van een lokale tabel, om de gegevens die u nodig hebt naar een tijdelijke tabel te halen. Vraag daar dan vanaf.

Als dat niet mogelijk is, moet u naar de verschillende dingen kijken die SQL Server de volledige tabel lokaal zouden moeten laden. Bijvoorbeeld met behulp van GETDATE()of zelfs bepaalde joins. Anderen Performance Killers omvatten niet de juiste rechten.

Zie http: // ThomasLarock. com / 2013/05 / Top-3-Performance-Killers-voor-Linked-Server-Queries / voor wat meer informatie.


2, Autoriteit 18%

SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')

Dit kan u helpen.


3, Autoriteit 7%

Voor degenen met problemen met deze andere antwoorden , probeer OPENQUERY

Voorbeeld:

SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 

4, Autoriteit 6%

Als u nog steeds een probleem vindt met <server>.<database>.<schema>.<table>

Serveer servernaam in []


5, Autoriteit 4%

U moet de schema / eigenaar (DBO standaard) opgeven als onderdeel van de referentie. Ook verdient het de voorkeur om de Nieuwere (ANSI-92) Join-stijl te gebruiken.

select foo.id 
    from databaseserver1.db1.dbo.table1 foo
        inner join databaseserver2.db1.dbo.table1 bar 
            on foo.name = bar.name

6, Autoriteit 4%

select * from [Server].[database].[schema].[tablename] 

Dit is de juiste manier om te bellen.
Controleer of de servers zijn gekoppeld voordat u de query uitvoert!

Controleren op gelinkte servers Bel:

EXEC sys.sp_linkedservers 

7, Autoriteit 2%

select name from drsql01.test.dbo.employee
  • drslq01 is servernmae – linked serer
  • Test is database-naam
  • dbo is schema-default schema
  • werknemer is een tafelnaam

Ik hoop dat het helpt te begrijpen, hoe u query kunt uitvoeren voor gelinkte server


8, Autoriteit 2%

Meestal directe query’s mogen niet worden gebruikt in het geval van gekoppelde server omdat het de Temp-database van SQL Server sterk gebruikt. Bij eerste stap worden gegevens opgehaald in TEMP DB dan voor het filteren. Er zijn hier veel discussies over. Het is beter om open openwaring te gebruiken, omdat het SQL doorgeeft naar de gelinkte server van de bron en vervolgens gefilterde resultaten retourneert, b.v.

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')

9, Autoriteit 2%

Klik met de rechtermuisknop op een tabel en klik op SCRIVT TABLE zoals Select


10

Voor wat het waard is, vond ik de volgende syntaxis om het beste te werken:

Selecteer * van [Linked_Server] … [Tabel]

Ik kon de aanbevelingen van anderen niet krijgen om te werken, met behulp van de databasenaam. Bovendien heeft deze gegevensbron geen schema.


11

Ik heb gedaan om het gegevenstype in de tabel bij Link_Server te vinden met behulp van openquery en de resultaten succesvol waren.

SELECT * FROM OPENQUERY (LINKSERVERNAME, '
SELECT DATA_TYPE, COLUMN_NAME
FROM [DATABASENAME].INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME  =''TABLENAME''
')

het werk voor mij


12

volgende query is het beste.

Probeer deze query:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

Het helpt zeer bij het koppelen van MySQL naar MS SQL


13

Voor MARIADB (en zo waarschijnlijk MySQL), probeert het schema te specificeren met behulp van de three-dot-syntaxis niet werkte, resulterend in de fout “Ongeldig gebruik van schema of catalogus”. De volgende oplossing werkte:

  1. in SSMS, ga naar Server Objects & GT; Linked Servers & GT; Providers & GT; MSDASQL
  2. Zorg ervoor dat “Dynamic Parameter”, “Level nul alleen”, en “INPROCESS” ALLE CONTROLEERD

U kunt vervolgens een schema en tabel onderzoeken met behulp van de volgende syntaxis:

SELECT TOP 10 *
FROM LinkedServerName...[SchemaName.TableName]

Bron: SELECTEER * FROM MySQL Linked Server using SQL Server zonder OpenQuery


Antwoord 14

In sql-server(local) zijn er twee manieren om gegevens van een gekoppelde server (extern) op te vragen.

Gedistribueerde zoekopdracht (vierdelige notatie):

  1. Werkt mogelijk niet met alle externe servers. Als uw externe server MySQL is, werkt gedistribueerde query niet.
  2. Filters en joins werken mogelijk niet efficiënt. Als u een eenvoudige query hebt met een WHERE-component, kan sql-server(local) eerst de volledige tabel van de externe server ophalen en vervolgens de WHERE-component lokaal toepassen. In het geval van grote tabellen is dit erg inefficiënt omdat veel gegevens van extern naar lokaal worden verplaatst. Dit is echter niet altijd het geval. Als de lokale server toegang heeft tot de tabelstatistieken van de externe server, kan dit net zo efficiënt zijn als het gebruik van openquery Meer details
  3. Aan de positieve kant zal de T-SQL-syntaxis werken.
SELECT * FROM [SERVER_NAME].[DATABASE_NAME].[SCHEMA_NAME].[TABLE_NAME] 

OPENVRAAG

  1. Dit is eigenlijk een pass-through. De query wordt volledig verwerkt op de externe server en zal dus gebruik maken van index of enige optimalisatie op de externe server. Het effectief verminderen van de hoeveelheid gegevens die wordt overgedragen van de externe naar de lokale sql-server.
  2. Klein nadeel van deze aanpak is dat de T-SQL-syntaxis niet werkt als de externe server iets anders is dan sql-server.
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME.SCHEMA_NAME.TABLENAME')

Algehele OPENQUERY lijkt in de meeste gevallen een veel betere optie om te gebruiken.

Other episodes