Hi to everybody
I used to use an application, which creates an SQL Query that exports all Tables of a Database to an Excelsheet. It worked very good for a long time. I worked with
- MS SQL Server 2005 and MS SQL Server 2008 R2
- MS Office 2003
- Windows XP.
Now, I work on a new computer with
- MS SQL Server 2008 R2 and
- MS Office 2007
- Windows 7
And the skript does not work anymore. I am not able to find the root cause of the problem (I am not the developer person but the user and therefore I only have basic know how in SQL and T-SQL).
Can anybody help me?
This is the SQL-Code:
-------Excel erzeugen
DECLARE @pfad varchar(255)
SET @pfad = 'F:\\08-02-2013_22-31\'
DECLARE @hr int -- Returncode der sp_OA... Aufrufe
DECLARE @katalog int -- Objektvariable für ADOX.Catalog
DECLARE @verbindung int -- Objektvariable für ADO.Connection
DECLARE @dbname varchar(255) -- Name der temporären Access-Datenbank
DECLARE @conString varchar(512) -- Verbindungszeichenfolge für Access-Datenbank
DECLARE @quelle varchar(255) -- Hilfsfeld für Fehlerbehandlung
DECLARE @beschreibung varchar(255) -- Hilfsfeld für Fehlerbehandlung
DECLARE @dummy int -- Dummy Output Parameter
DECLARE @Excel_Mappe varchar(255) -- Vollständiger Name der Ziel Excelmappe
DECLARE @tabelle varchar(255) -- Name der zu exportierenden Tabelle
DECLARE @besitzer varchar(255) -- Besitzer der zu exportierenden Tabelle
DECLARE @exec varchar(4000) -- Hilfsvariable für dynamische Ausführungen
-- Cursor zum Ermitteln aller Tabellen ohne Text- und Image-Spalten
DECLARE curTabellen CURSOR FAST_FORWARD FOR
SELECT t.TABLE_SCHEMA, t.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES t
WHERE TABLE_TYPE = 'BASE TABLE'
AND NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('text', 'ntext', 'image')
AND TABLE_CATALOG = t.TABLE_CATALOG AND
TABLE_SCHEMA = t.TABLE_SCHEMA AND
TABLE_NAME = t.TABLE_NAME)
ORDER BY TABLE_NAME
-- Erzeugen eines ADOX-Katalog Objekts
EXEC @hr = master.dbo.sp_OACreate 'ADOX.Catalog', @katalog OUTPUT
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @katalog, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Erstellen des ADOX.Catalog Objekts: %s', 10 , -1, @beschreibung)
END
-- Zufälliges Erzeugen eines Datenbank-Namens
SET @dbname = @pfad + CAST(newid() AS varchar(100)) + '.MDB'
-- Erstellen der Verbindungszeichenfolge
SET @conString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + @dbname
-- Erstellen einer neuen (leeren) Access-Datenbank
-- Dieser Schritt ist notwendig, da nur über eine Verbindung zu einer Access-Datenbank
-- die benötigte Jet-Funktionalität zur Verfügung steht
EXEC @hr = master.dbo.sp_OAMethod @katalog, 'Create',
@dummy output,
@conString
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @katalog, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Erstellen der Access-Datenbank %s: %s', 10 , -1, @dbname, @beschreibung)
END
-- Variable @verbindung auf die Eigenschaft "ActiveConnection" des Katalog-Objekts setzen
EXEC @hr = master.dbo.sp_OAGetProperty @katalog, 'ActiveConnection', @verbindung OUTPUT
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Zugriff auf Access-Datenbank %s: %s', 10 , -1, @dbname, @beschreibung)
END
-- Öffnen des Cursors und Export für alle gefundenen Tabellen durchlaufen
OPEN curTabellen
FETCH NEXT FROM curTabellen INTO @besitzer, @tabelle
WHILE @@FETCH_STATUS = 0
BEGIN
-- Dynamisches Erzeugen der SELECT INTO Anweisung
SET @exec = 'SELECT TOP 65535 * INTO [Excel 8.0;Database=' + @pfad + db_name() + '.xls].[' + @besitzer + '_' + @tabelle + '] FROM [ODBC;Driver=SQL Server;Database=' + DB_NAME() + ';Server=' + @@SERVERNAME + ';Trusted_Connection=Yes;].['+ @besitzer + '.' + @tabelle + ']'
EXEC @hr = master.dbo.sp_OAMethod @verbindung, 'Execute', @dummy output, @exec
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Export: (%s): %s', 10 , -1, @exec, @beschreibung)
END
FETCH NEXT FROM curTabellen INTO @besitzer, @tabelle
END
-- "Aufräumarbeiten"
CLOSE curTabellen
DEALLOCATE curTabellen
EXEC @hr = master.dbo.sp_OAMethod @verbindung, 'Close'
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Schliessen der Verbindung zur Access-Datenbank: %s', 10 , -1, @beschreibung)
END
EXEC @hr = master.dbo.sp_OADestroy @verbindung
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Zerstören des ADO-Connection Objekts: %s', 10 , -1, @beschreibung)
END
EXEC @hr = master.dbo.sp_OADestroy @katalog
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Zerstören des ADO-Connection Objekts: %s', 10 , -1, @beschreibung)
END
-- Temporäre Access-Datenbank löschen
SET @exec = 'DEL "' + @dbname + '"'
EXEC master.dbo.xp_cmdshell @exec ,NO_OUTPUT
GO
And this is the error message:
Fehler beim Erstellen der Access-Datenbank F:\\08-02-2013_22-31\863D2122-986A-4D8D-A401-B9EE78DF7EEF.MDB: Klasse nicht registriert
Fehler beim Zugriff auf Access-Datenbank F:\\08-02-2013_22-31\863D2122-986A-4D8D-A401-B9EE78DF7EEF.MDB: Typkonflikt.
Fehler beim Export: (SELECT TOP 65535 * INTO [Excel 8.0;Database=F:\\08-02-2013_22-31\Total.xls].[dbo_Test] FROM [ODBC;Driver=SQL Server;Database=Total;Server=NB;Trusted_Connection=Yes;].[dbo.Buch]): Syntax für sp_OAMethod: ObjPointer int IN, MethodName varchar IN [, @returnval <any> OUT [, zusätzliche IN-, OUT- oder BOTH-Parameter]].
Fehler beim Schliessen der Verbindung zur Access-Datenbank: Syntax für sp_OAMethod: ObjPointer int IN, MethodName varchar IN [, @returnval <any> OUT [, zusätzliche IN-, OUT- oder BOTH-Parameter]].
Fehler beim Zerstören des ADO-Connection Objekts: Syntax für sp_OADestroy: ObjPointerToBeDestroyed int IN.
Any Ideas how to fix it?
Thanks a lot
Angeline
I used to use an application, which creates an SQL Query that exports all Tables of a Database to an Excelsheet. It worked very good for a long time. I worked with
- MS SQL Server 2005 and MS SQL Server 2008 R2
- MS Office 2003
- Windows XP.
Now, I work on a new computer with
- MS SQL Server 2008 R2 and
- MS Office 2007
- Windows 7
And the skript does not work anymore. I am not able to find the root cause of the problem (I am not the developer person but the user and therefore I only have basic know how in SQL and T-SQL).
Can anybody help me?
This is the SQL-Code:
-------Excel erzeugen
DECLARE @pfad varchar(255)
SET @pfad = 'F:\\08-02-2013_22-31\'
DECLARE @hr int -- Returncode der sp_OA... Aufrufe
DECLARE @katalog int -- Objektvariable für ADOX.Catalog
DECLARE @verbindung int -- Objektvariable für ADO.Connection
DECLARE @dbname varchar(255) -- Name der temporären Access-Datenbank
DECLARE @conString varchar(512) -- Verbindungszeichenfolge für Access-Datenbank
DECLARE @quelle varchar(255) -- Hilfsfeld für Fehlerbehandlung
DECLARE @beschreibung varchar(255) -- Hilfsfeld für Fehlerbehandlung
DECLARE @dummy int -- Dummy Output Parameter
DECLARE @Excel_Mappe varchar(255) -- Vollständiger Name der Ziel Excelmappe
DECLARE @tabelle varchar(255) -- Name der zu exportierenden Tabelle
DECLARE @besitzer varchar(255) -- Besitzer der zu exportierenden Tabelle
DECLARE @exec varchar(4000) -- Hilfsvariable für dynamische Ausführungen
-- Cursor zum Ermitteln aller Tabellen ohne Text- und Image-Spalten
DECLARE curTabellen CURSOR FAST_FORWARD FOR
SELECT t.TABLE_SCHEMA, t.TABLE_NAME FROM INFORMATION_SCHEMA.TABLES t
WHERE TABLE_TYPE = 'BASE TABLE'
AND NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('text', 'ntext', 'image')
AND TABLE_CATALOG = t.TABLE_CATALOG AND
TABLE_SCHEMA = t.TABLE_SCHEMA AND
TABLE_NAME = t.TABLE_NAME)
ORDER BY TABLE_NAME
-- Erzeugen eines ADOX-Katalog Objekts
EXEC @hr = master.dbo.sp_OACreate 'ADOX.Catalog', @katalog OUTPUT
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @katalog, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Erstellen des ADOX.Catalog Objekts: %s', 10 , -1, @beschreibung)
END
-- Zufälliges Erzeugen eines Datenbank-Namens
SET @dbname = @pfad + CAST(newid() AS varchar(100)) + '.MDB'
-- Erstellen der Verbindungszeichenfolge
SET @conString = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=' + @dbname
-- Erstellen einer neuen (leeren) Access-Datenbank
-- Dieser Schritt ist notwendig, da nur über eine Verbindung zu einer Access-Datenbank
-- die benötigte Jet-Funktionalität zur Verfügung steht
EXEC @hr = master.dbo.sp_OAMethod @katalog, 'Create',
@dummy output,
@conString
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @katalog, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Erstellen der Access-Datenbank %s: %s', 10 , -1, @dbname, @beschreibung)
END
-- Variable @verbindung auf die Eigenschaft "ActiveConnection" des Katalog-Objekts setzen
EXEC @hr = master.dbo.sp_OAGetProperty @katalog, 'ActiveConnection', @verbindung OUTPUT
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Zugriff auf Access-Datenbank %s: %s', 10 , -1, @dbname, @beschreibung)
END
-- Öffnen des Cursors und Export für alle gefundenen Tabellen durchlaufen
OPEN curTabellen
FETCH NEXT FROM curTabellen INTO @besitzer, @tabelle
WHILE @@FETCH_STATUS = 0
BEGIN
-- Dynamisches Erzeugen der SELECT INTO Anweisung
SET @exec = 'SELECT TOP 65535 * INTO [Excel 8.0;Database=' + @pfad + db_name() + '.xls].[' + @besitzer + '_' + @tabelle + '] FROM [ODBC;Driver=SQL Server;Database=' + DB_NAME() + ';Server=' + @@SERVERNAME + ';Trusted_Connection=Yes;].['+ @besitzer + '.' + @tabelle + ']'
EXEC @hr = master.dbo.sp_OAMethod @verbindung, 'Execute', @dummy output, @exec
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Export: (%s): %s', 10 , -1, @exec, @beschreibung)
END
FETCH NEXT FROM curTabellen INTO @besitzer, @tabelle
END
-- "Aufräumarbeiten"
CLOSE curTabellen
DEALLOCATE curTabellen
EXEC @hr = master.dbo.sp_OAMethod @verbindung, 'Close'
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Schliessen der Verbindung zur Access-Datenbank: %s', 10 , -1, @beschreibung)
END
EXEC @hr = master.dbo.sp_OADestroy @verbindung
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Zerstören des ADO-Connection Objekts: %s', 10 , -1, @beschreibung)
END
EXEC @hr = master.dbo.sp_OADestroy @katalog
IF @hr <> 0 -- Fehlerbehandlung
BEGIN
EXEC sp_OAGetErrorInfo @verbindung, @quelle OUTPUT, @beschreibung OUTPUT
RAISERROR ( 'Fehler beim Zerstören des ADO-Connection Objekts: %s', 10 , -1, @beschreibung)
END
-- Temporäre Access-Datenbank löschen
SET @exec = 'DEL "' + @dbname + '"'
EXEC master.dbo.xp_cmdshell @exec ,NO_OUTPUT
GO
And this is the error message:
Fehler beim Erstellen der Access-Datenbank F:\\08-02-2013_22-31\863D2122-986A-4D8D-A401-B9EE78DF7EEF.MDB: Klasse nicht registriert
Fehler beim Zugriff auf Access-Datenbank F:\\08-02-2013_22-31\863D2122-986A-4D8D-A401-B9EE78DF7EEF.MDB: Typkonflikt.
Fehler beim Export: (SELECT TOP 65535 * INTO [Excel 8.0;Database=F:\\08-02-2013_22-31\Total.xls].[dbo_Test] FROM [ODBC;Driver=SQL Server;Database=Total;Server=NB;Trusted_Connection=Yes;].[dbo.Buch]): Syntax für sp_OAMethod: ObjPointer int IN, MethodName varchar IN [, @returnval <any> OUT [, zusätzliche IN-, OUT- oder BOTH-Parameter]].
Fehler beim Schliessen der Verbindung zur Access-Datenbank: Syntax für sp_OAMethod: ObjPointer int IN, MethodName varchar IN [, @returnval <any> OUT [, zusätzliche IN-, OUT- oder BOTH-Parameter]].
Fehler beim Zerstören des ADO-Connection Objekts: Syntax für sp_OADestroy: ObjPointerToBeDestroyed int IN.
Any Ideas how to fix it?
Thanks a lot
Angeline