2016-09-10 23 views
1

Ich habe diese Openrowset-Abfrage, wo ich einen Pfad übergeben kann, um die richtige Excel-Datei zu erhalten. Ich kann nicht die genaue Anzahl der Angebote und/oder die TypkonvertierungÜbergeben einer Date-Variable in einer Openrowset-Abfrage

Ich muss eine WHERE Anweisung übergeben, um ein bestimmtes Datum in der Tabelle zu erhalten. Ich komme aus VBA, wo Sie 2 Zitate und 2 & setzen und Sie sind fertig. Es scheint, dass SQL Hunderte von ihnen benötigt! (Wenn jemand einen Link zu einer Online-Universität zu SQL hat Zitate, die sehr geschätzt werden würden)

set @sql1 = 'select * 
      FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
         ''Excel 12.0;Database=' + @filePath1 + '' + ';' + '''' + ', 
      ''Select * from [Sheet1$] '''+')' 

exec(@sql1) 

Ich mag würde WHERE DATE = @PnLDate

Antwort

0

Die Regel hinzuzufügen ist sehr ähnlich zu dem, was wissen Sie, es aber gilt für einfaches Angebot '. Wenn Sie eine von ihnen in einer Zeichenfolge möchten Sie Escape es mit zwei ''. Abgesehen von ihnen müssen Sie einen zum Öffnen und einen zum Schließen haben.

Die Zeichenfolge, die Sie anzeigen, ist ein wenig kompliziert, nur weil es unnötige leere Strings enthält, und sekundär verknüpften Stirns, die nur für nur eine resultierende Zeichenfolge ersetzt werden können. Unterhalb einer simiplificated Version Ihrer string:

set @sql1 = 'select * 
     FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
      ''Excel 12.0;Database=' + @filePath1 + ';'', 
      ''Select * from [Sheet1$] '')' 

Mit Ihrer where angefordert werden können:

DECLARE @PnLDate datetime  -- may be varchar instead, if so, must remove convert(....) and use straight @PnLDate 
set @PnLDate = '2014/08/01' 

set @sql1 = 'select * 
     FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
      ''Excel 12.0;Database=' + @filePath1 + ';'', 
      ''Select * from [Sheet1$] where DATE = #'+  -- hash # is MS Access delimiter for dates 
      convert(varchar(25), @PnLDate, 111) 
      +'#'')'          -- results in #2014/08/01# 

Seien Sie gewarnt, dass, wenn Sie „dynamische SQL“ Ihre Daten verwenden können, Schadcode auf die Saite injizieren. lesen sql Injection über

+0

dieser Methode: ' Satz @PnLDate = konvertieren (nvarchar (max), @ PnLDate) Satz @ sql1 = 'select * FROM OPENROWSET (' 'Microsoft.ACE.OLEDB.12.0 '', '' Excel 12.0; Database = '+ @ filePath1 + ';'', '' Select * from [Sheet1 $] WHERE dDate = '+ @PnLDate +' '')‘ ' I Erhalte diesen Fehler: Die Datentypen nvarchar (max) und date sind im add-Operator inkompatibel. – Rich

+0

der Fehler kommt Form, dass @PnLDate in eine Zeichenfolge konvertiert werden muss, um zufrieden zu sein. (Es gibt nur wenige Dinge, die der SQL-Server automatisch mit seinen Typen verknüpft, datetime ist keine.). Beachten Sie auch, dass die resultierende Zeichenfolge ein gültiger SQL-Satz sein muss. Der Fall, der zu Ihrem Fall führen könnte, sollte als "DDate = 12/31/2015" gelesen werden, wobei die notwendigen Zitate um die Datumskonstante fehlen. Sehen Sie die Konvertierung in meinem bearbeiteten Beispiel und die hinzugefügten Anführungszeichen zu sorround –

+0

Vielen Dank für Ihre Hilfe, aber ich habe kein Glück mit diesem Ich ändere den Typ für 'DECLARE @PnLDate varchar (25)' Dann setze ich die Variable wie dies: 'set @PnLDate = 08/01/2014' Dann habe ich Ihre Abfrage verwendet und ich bekomme dies: _ Kann nicht die Abfrage ausführen" Select * von [Sheet1 $] wo DATE = "08-01-2014" "OLE DB-Provider ich habe auch versucht, die doppelten Anführungszeichen zu entfernen, und es funktioniert immer noch nicht – Rich

Verwandte Themen