2016-09-02 1 views
0

J'essaie d'utiliser SQL dynamique qui va analyser dans le répertoire de fichiers dans un OpenRowSet (@Database). À l'heure actuelle, j'ai un répertoire codé en dur pour le fichier Excel. Le résultat final sera de créer une application qui prendra le fichier de l'utilisateur et l'importera dans la table SQL. De là, je vais fusionner et Match/Not Matching (qui fonctionne correctement). C'est la dernière pièce du puzzle. Je ne sais pas pourquoi le message d'erreur est à la recherche de mon dossier dans "C: \ WINDOWS \ system32 \"SQL - SQL dynamique à l'intérieur de OpenRowSet puis inséré dans la table temporaire

Mes messages d'erreur actuels sont les suivants:

fournisseur OLE DB « Microsoft.ACE.OLEDB. 12.0 "pour le serveur lié" (null) "message retourné" Le moteur de base de données Microsoft Access n'a pas pu trouver l'objet 'C: \ WINDOWS \ system32 \ C: \ Utilisateurs \ GrimRieber \ Desktop \ isi test.xlsx'. Si 'C: \ WINDOWS \ system32 \ C: \ Users \ GrimRieber \ Desktop \ isi test.xlsx' n'est pas un objet local, vérifiez votre connexion réseau ou contactez le serveur. administrateur.".

Msg 7303, niveau 16, état 1, ligne 1
Impossible d'initialiser l'objet source de données du fournisseur OLE DB "Microsoft.ACE.OLEDB.12.0" pour le serveur lié "(null)".

code:

declare @Database varchar(max) 

select @Database = 'C:\Users\GrimRieber\Desktop\isi test.xlsx' 

declare @sql varchar(Max) 

select @sql = 'SELECT * FROM OPENROWSET(
''Microsoft.ACE.OLEDB.12.0'', 
''Excel 12.0; Database= ' + @Database + '; HDR=YES; IMEX=1'', 
''SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num],[01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[Year]FROM [Data$]'' 
)' 

IF OBJECT_ID('tempdb.dbo.#TempScorecardInventorySold', 'U') IS NOT NULL 
    DROP TABLE #TempScorecardInventorySold; 

CREATE TABLE #TempScorecardInventorySold 
(
    [Vendor] [varchar](50) NULL, 
    [VendorName] [varchar](50) NULL, 
    [Material] [varchar](50) NULL, 
    [MaterialName] [varchar](50) NULL, 
    [Supplier Stock Num] [varchar](50) NULL, 
    [01] [nVarchar](50) NULL, 
    [02] [nVarchar](50) NULL, 
    [03] [nVarchar](50) NULL, 
    [04] [nVarchar](50) NULL, 
    [05] [nVarchar](50) NULL, 
    [06] [nVarchar](50) NULL, 
    [07] [nVarchar](50) NULL, 
    [08] [nVarchar](50) NULL, 
    [09] [nVarchar](50) NULL, 
    [10] [nVarchar](50) NULL, 
    [11] [nVarchar](50) NULL, 
    [12] [nVarchar](50) NULL, 
    [Year] [Int] Null 
) ON [PRIMARY]; 

INSERT INTO [dbo].#TempScorecardInventorySold ([Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num],[01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[Year]) 
EXECUTE(@sql) 

Répondre

0

Bien que je ne peux pas recréer votre problème de chemin de fichier (assurez-vous de vérifier attentivement si le fichier existe sur le chemin et extension de fichier), le OPENROWSET() dans cette configuration devrait définir des champs dans la SELECT clause au début. Le dernier argument devrait unquoted, pointant vers la feuille de travail gamme:

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
       ''Excel 12.0; Database= ' + @Database + '; HDR=YES; IMEX=1'', [Data$])'; 

Vous pouvez également envisager OPENDATASOURCE:

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENDATASOURCE(''Microsoft.ACE.OLEDB.12.0'', 
       ''Data Source=' + @Database + ';Extended Properties=Excel 12.0'')...Data$' 

Ou même une version pilote (les champs peuvent être dans l'une des deux clauses SELECT)

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENROWSET(''MSDASQL'', 
       ''Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; 
       DBQ=' + @Database + ''', ''SELECT * FROM [DATA$]''); 
+0

Nous vous remercions de votre réponse rapide! L'OPENDATASOURCE a corrigé les problèmes que j'avais. Je devais juste ajouter une coche à la fin de Data $ et tout a fonctionné. –

+0

Super! Heureux d'avoir pu aider. Mais c'est intéressant le premier ne fonctionne pas. Peut être un paramètre/une version. – Parfait