|
Datenimport/-export - Werkzeuge
Ad-hoc Abfragen mit OPENROWSET und OPENDATASOURCE
[Achtung. Diese Seite wird zur Zeit noch bearbeitet...]
Ad-hoc Abfragen sind ein flexibles Mittel, um schnell innerhalb von Transact-SQL auf Daten einer fremden Datenquelle zuzugreifen.
Da bei diesem Aufruf die Verbindungsoptionen (insbesondere der Sicherheitskontext) dynamisch angegeben wird, sollte in jedem Fall
geprüft werden, ob solche Abfragen überhaupt zugelassen werden sollten (s.dazu auch: OPENROWSET-Problem in SQL Server 7.0).
OPENROWSET
Mit Hilfe der Funktion OPENROWSET kann ein Rowset von einer OLEDB-Datenquelle geöffnet werden.
Diese Funktion benötigt als Parameter den zu verwendenden OLEDB-Provider und alle weiteren notwendigen
Verbindungseigenschaften incl. des Sicherheitskontexts. Als letzter Parameter wird die auszuführende SELECT-Anweisung angegeben.
Syntax:
Die Grundsyntax für OPENROWSET sieht so aus:
OPENROWSET ('name_des_OLEDB_providers' , 'verbindungszeichenfolge', 'abfrage')
Die Parameter
name_des_OLEDB_providers
Der Name des OLEDB-Providers, z.B. SQLOLEDB für Zugriffe auf SQL Server, Microsoft.Jet.OLEDB.4.0 für den Zugriff auf Access-Datenbanken, Excel-Arbeitsmappen, Textdateien, dBase-Dateien etc.)
verbindungszeichenfolge
Die Verbindungszeichenfolge für den OLEDB-Provider. Die hier anzugebende Zeichenfolge wird vom SQL
Server intern interpretiert und entspricht (leider) nicht genau dem "gewohnten" Aufbau.
abfrage
Die Abfrage auf die Daten in der fernen Datenquelle. In der Regel ein SELECT auf die gewünschte Tabelle
Beispiele SQL Server/SQLOLEDB
Zugriff auf einen anderen SQL Server mit vertrauter Sicherheit
-- Select auf anderen SQL Server mit vertrauter Verbindung SELECT * FROM OPENROWSET ('SQLOLEDB', 'Server=anderer_server;database=Northwind;TRUSTED_CONNECTION=YES;', 'SELECT * FROM northwind.dbo.orders')
Vorsicht Falle!
Das folgende Beispiel gibt Server und Datenbank über die OLEDB-Properties an; diese Parameter werden jedoch ignoriert
-- vorsicht: Hier werden Data Source und Initial Catalog ignoriert... -- stattdessen wird eine Verbindung zum lokalen Server aufgebaut... SELECT * FROM OPENROWSET('SQLOLEDB', 'Data Source=anderer_Server;Initial Catalog=beispiel5;TRUSTED_CONNECTION=YES;', 'SELECT @@servername, * FROM northwind.dbo.orders')
Update auf Daten eines anderen SQL Servers
Vorsicht! Diese Anweisung ändert Daten auf dem angegebenen Server.
UPDATE OPENROWSET('SQLOLEDB', 'Server=anderer_server;Database=Northwind;TRUSTED_CONNECTION=YES;', 'SELECT * FROM northwind.dbo.orders') SET orderdate = orderdate + 1
Einfügen neuer Datensätze in einer "entfernten" Tabelle
Vorsicht! Diese Anweisung ändert Daten auf dem angegebenen Server.
INSERT INTO OPENROWSET('SQLOLEDB', 'Server=anderer_server;Database=Northwind;TRUSTED_CONNECTION=YES;', 'SELECT * FROM northwind.dbo.region') VALUES (99, 'Test')
Löschen von Daten in einer Tabelle
Vorsicht! Diese Anweisung ändert Daten auf dem angegebenen Server.
DELETE FROM OPENROWSET('SQLOLEDB', 'Server=anderer_server;Database=Northwind;TRUSTED_CONNECTION=YES;', 'SELECT * FROM northwind.dbo.region') WHERE RegionID = 99
Beispiele Access Datenbanken/JET
Zugriff auf Daten in einer Access-Datenbank mit SELECT
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', ';Database=C:\Access-Datenbanken\nordwind.mdb', 'SELECT * FROM artikel')
Zugriff auf Daten in einer kennwortgeschützten Access-Datenbank mit SELECT
-- Select mit Kennwortgeschützter Datenbank SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', ';Database=C:\Access-Datenbanken\vertraulich.mdb;pwd=geheim;', 'SELECT * FROM umsatz') GO
Aktualisieren von Daten in einer Jet-Datenbank
Vorsicht! Diese Anweisung ändert Daten in der angegebenen Datenbank.
UPDATE OPENROWSET('Microsoft.Jet.OLEDB.4.0', ';Database=C:\Access-Datenbanken\nordwind.mdb', 'SELECT * FROM artikel') SET einzelpreis = einzelpreis + 1 GO
Beispiele Excel-Arbeitsmappen/JET
Abfragen eines Arbeitsblatts
SELECT * FROM OPENROWSET('Microsoft.JET.OLEDB.4.0', 'Excel 8.0;Database=C:\training\inventur.xls', 'SELECT * FROM [Filiale1$]')
Abfragen bestimmter Zellen in einem Arbeitsblatt
SELECT * FROM OPENROWSET('Microsoft.JET.OLEDB.4.0', 'Excel 8.0;HDR=NO;Database=C:\training\inventur.xls', 'SELECT * FROM [Filiale1$A2:B4]')
Aktualisieren von Zellen in einem Arbeitsblatt
Vorsicht! Dieses Beispiel ändert Daten im angegebenen Excel-Arbeitsblatt
UPDATE OPENROWSET('Microsoft.JET.OLEDB.4.0', 'Excel 8.0;Database=C:\training\inventur.xls', 'SELECT * FROM [Filiale1$]') SET Bestand = 1 WHERE Bestand = 2
Hinzufügen von Daten in ein Excel-Arbeitsblatt
Vorsicht! Dieses Beispiel ändert Daten im angegebenen Excel-Arbeitsblatt
INSERT INTO OPENROWSET('Microsoft.JET.OLEDB.4.0', 'Excel 8.0;Database=C:\training\inventur.xls', 'SELECT * FROM [Filiale1$]') (Produkt, Bestand) VALUES ('Test', 27) GO
Beispiele Textdateien/JET
Abfragen von Daten aus einer Textdatei
-- Abfragen einer Textdatei SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0', 'Text;Database=C:\;', 'SELECT * FROM [orders#txt]') /* Inhalt der Datei SCHEMA.INI auf C:\ [orders.txt] Format=TABDelimited ColNameHeader=false MaxScanRows=20 */
Anfügen eines Satzes in eine Textdatei
-- Einfügen eines neuen Satzes INSERT INTO OPENROWSET('MICROSOFT.JET.OLEDB.4.0', 'Text;Database=C:\;', 'SELECT * FROM [textdemo#txt]') VALUES ('XXX', 100) -- Prüfen, ob der neue Satz angefügt wurde: SELECT * FROM OPENROWSET('MICROSOFT.JET.OLEDB.4.0', 'Text;Database=C:\;', 'SELECT * FROM [textdemo#txt]') /* Zugehörige Schema.ini Datei [textdemo.txt] CharacterSet=ANSI Format=TABDelimited ColNameHeader=TRUE MaxScanRows=20 */ GO
Beispiele HTML-Dateien/Jet
Lesen der Daten aus einer HTML-Tabelle mit Caption
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'HTML Import;HDR=NO;Database=http://localhost/beispiele/tablemitcaption.htm;', 'SELECT * FROM Beispieltabelle')
OPENDATASOURCE
OPENDATASOURCE wurde im SQL Server 2000 eingeführt. Diese Funktion erlaubt die Verwendung einer OLEDB-Datenquelle in einem vierstelligem Namen.
Im Gegensatz zu OPENROWSET werden hier die "echten" OLEDB-Provider Eigenschaften verwendet.
Syntax
OPENDATASOURCE ( provider, provider_zeichenfolge )
Parameter
Beispiele SQL Server/SQLOLEDB
Lesender Zugriff auf Daten eines anderen Servers
-- Integrierte Sicherheit SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=itrainbo2000;Initial Catalog=Northwind;Integrated Security=SSPI;').Northwind.dbo.orders -- SQL Login SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=itrainbo2000;Initial Catalog=Northwind;User ID=student;Password=#student#;').Northwind.dbo.orders
Aufruf einer gespeicherten Prozedur mit Parameter auf einem entfernten SQL Server
EXEC OPENDATASOURCE('SQLOLEDB', 'Data Source=itrainbo2000;Initial Catalog=Northwind;Integrated Security=SSPI;').Northwind.dbo.CustorderHist 'ALFKI'
Beispiele Access/JET
SELECT auf eine Tabelle in einer Access-Datenbank
SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=C:\Access-Datenbanken\nordwind.mdb;')...artikel
SELECT auf eine kennwortgeschützte Tabelle in einer Access-Datenbank
SELECT * FROM OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=C:\Access-Datenbanken\umsatz.mdb;Jet OLEDB:Database Password=geheim')...tabzahlen
Beispiele Excel-Arbeitsmappe/JET
Abfragen des gesamten Inhalts eines Arbeitsblatts
SELECT * FROM OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$]
Der Zugriff auf einzelne Bereiche innerhalb des Arbeitsblatt über Zellenreferenzen ist in Kombination mit OPENDATASOURCE so nicht möglich:
-- Das geht nicht: SELECT * FROM OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$A1:B3]
Aktualisieren von Werten in einem Excel-Arbeitsblatt
Vorsicht! Dieses Beispiel verändert Daten in dem angegebenen Arbeitsblatt
UPDATE OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$] SET bestand = bestand + 1
Einfügen einer Zeile in ein Excel-Arbeitsblatt
Vorsicht! Dieses Beispiel verändert Daten in dem angegebenen Arbeitsblatt
INSERT INTO OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$] (bestand, produkt) VALUES (100, 'Test')
Einfügen von Daten aus einer SQL Server Tabelle in eine Excel-Arbeitsmappe
INSERT INTO OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls')...[Filiale1$] (Produkt, Bestand) SELECT ProductName, 0 FROM northwind.dbo.products
Beispiele HTML-Dateien/JET
Abfrage einer HTML-Tabelle mit Caption und Spaltenüberschriften
SELECT * FROM OPENDATASOURCE('Microsoft.JET.OLEDB.4.0', 'Extended Properties=HTML Import;Data Source=http://localhost/beispiele/tablemitcaption.htm;')...Beispieltabelle
Erlaubte Operationen nach Datenquelle
| Provider | SELECT | INSERT | UPDATE | DELETE |
| SQLOLEDB | ja | ja | ja | ja |
| Jet/Access | ja | ja | ja | ja |
| Jet/Excel | ja | ja | ja | nein |
| Jet/Text | ja | ja | nein | nein |
| Jet/Lotus Worksheet | ja | ja | ja | nein |
| Jet/HTML | ja | nein | nein | nein |
| Jet/dBase | ja | ja | ja | ja |
| Jet/Paradox | ja | ja | ja | ja |
Typische Fehlermeldungen in Zusammenhang mit OPENROWSET
[OLE/DB provider returned message: Deferred prepare could not be completed.]
Sie haben beim Zugriff auf die Tabelle nicht den voll-qualifierten Namen (datenbank.besitzer.tabelle) angegeben.
Der Ad-hoc-Zugriff auf den OLE DB-Provider 'Microsoft.Jet.OLEDB.4.0' wurde verweigert. Sie müssen auf diesen Provider über einen Verbindungsserver zugreifen.
Der Ad-hoc Zugriff auf den OLEDB-Provider Jet.OLEDB wurde aus Sicherheitsgründen deaktiviert.
Greifen Sie entweder über einen Verbindungsserver auf die Daten zu oder aktivieren Sie Adhoc-Zugriffe für den
JET-OLEDB Provider (Achtung! Dies beeinträchtigt die Sicherheit des Servers.)
So prüfen Sie, ob Ad-Hoc Abfragen zugelassen sind:
- Öffnen Sie im Enterprise Manager den Unterpunkt Sicherheit.
- Öffnen Sie das Kontextmenü des Unterpunkts "Verbindungsserver" und wählen Sie den
Menüpunkt "Neuer Verbindungsserver" aus.
- Wählen Sie in der Auswahlliste "Providername" den Provider "Microsoft.Jet.OLEDB.4.0" aus.
- Klicken Sie auf die Schaltfläche "Provideroptionen".
- Prüfen Sie in der Liste "Provideroptionen" den Wert für die Option "Ad-hoc Zugriffe nicht zulassen".
Die folgende Anweisung können Sie verwenden, um per Transact-SQL Script zu prüfen, ob Ad-hoc Zugriffe für den
Microsoft Jet.4.0.OLEDB Provider zugelassen sind:
EXEC master..xp_instance_regread
N'HKEY_LOCAL_MACHINE',
N'SOFTWARE\Microsoft\MSSQLServer\Providers\Microsoft.Jet.OLEDB.4.0',
N'DisallowAdhocAccess'
Der OLE DB-Provider 'Microsoft.JET.OLEDB.4.0' meldete einen Fehler.
[OLE/DB provider returned message: Installierbares ISAM nicht gefunden.]
Prüfen Sie, ob der angegebene ISAM-Treiber auf dem Server verfügbar ist.
In vielen Fällen führt auch eine fehlerhafte Angabe in der Verbindungszeichenfolge zu dieser Fehlermeldung.
|