2013-02-18 2 views
5

Nach viel Googeln, habe ich mit dem folgenden Makro, die ich hoffe, eine Verbindung zu einer Datenbank, eine vorhandene temporäre Tabelle löschen und dann erstellen ein neue (füllen Sie sie aus und sehen Sie sich die Ergebnisse an).Erstellen einer temporären Tabelle in SQL Server 2008 mit einem Excel-Makro (ADODB)

Dim adoCn As ADODB.Connection 
Dim adoRs As ADODB.Recordset 
Dim adoCm As ADODB.Command 
Dim strSQL As String 

Set adoCn = New ADODB.Connection 
With adoCn 
    .ConnectionString = "Provider=SQLOLEDB;" & _ 
         "Initial_Catalog=XXX;" & _ 
         "Integrated Security=SSPI;" & _ 
         "Persist Security Info=True;" & _ 
         "Data Source=XXX;" & _ 
         "Extended Properties='IMEX=1'" 
    .CursorLocation = adUseServer 
    .Open 
End With 

Set adoCm = New ADODB.Command 

With adoCm 
    Set .ActiveConnection = adoCn 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('tempdb..#AgedProducts') IS NOT NULL DROP TABLE #AgedProducts" 
    .Execute 
    .CommandText = "CREATE TABLE #AgedProducts " & _ 
        "(Source_Order_Number VARCHAR(255)) " & _ 
        "INSERT INTO #AgedProducts VALUES ('AB-123-456') " & _ 
        "SELECT * FROM #AgedProducts (NOLOCK) " 
    .Execute 
End With 

Set adoRs = New ADODB.Recordset 
With adoRs 
    Set .ActiveConnection = adoCn 
    .LockType = adLockBatchOptimistic 
    .CursorLocation = adUseServer 
    .CursorType = adOpenForwardOnly 
    .Open "SET NOCOUNT ON" 
End With 
adoRs.Open adoCm 

MsgBox "Recordset returned...", vbOKOnly 

While Not adoRs.EOF 
    Debug.Print adoRs.Fields(0).Value 
    adoRs.MoveNext 
Wend 

adoCn.Close 

Set adoCn = Nothing 
Set adoRs = Nothing 

Wenn ich die Abfrage ausführen ich die folgende Fehlermeldung erhalten:

Run-time error '-2147217887 (80040e21)':

The requested properties cannot be supported

Die NOCOUNT Linie kommt aus http://support.microsoft.com/kb/235340 (so viel von dem obigen Code der Fall ist). Ich habe IMEX=1 hinzugefügt, um Bestellnummer zu berücksichtigen, könnte mehrere Typen dort haben, aber ich bezweifle, dass dort das Problem geschieht.

Jede Hilfe wird sehr geschätzt!

Antwort

5

Ändern Sie die Art und Weise, wie das Recodset geöffnet wird, und verschieben Sie die Auswahl aus dem Befehl in den Methodenaufruf recodset open.

With adoCm 
    Set .ActiveConnection = adoCn 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('tempdb..#AgedProducts') IS NOT NULL DROP TABLE #AgedProducts" 
    .Execute 
    .CommandText = "CREATE TABLE #AgedProducts " & _ 
        "(Source_Order_Number VARCHAR(255)) " & _ 
        "INSERT INTO #AgedProducts VALUES ('AB-123-456') " 
    .Execute 
End With 

Set adoRs = New ADODB.Recordset 
With adoRs 
    Set .ActiveConnection = adoCn 
    .LockType = adLockBatchOptimistic 
    .CursorLocation = adUseServer 
    .CursorType = adOpenForwardOnly 

End With 
adoRs.Open "SELECT * FROM #AgedProducts (NOLOCK)" 
+0

Danke dafür - funktioniert ein Leckerbissen. Weißt du, warum das funktioniert, anstatt meinen ersten Versuch? –

+1

Recodset muss wissen, was darin enthalten sein sollte, daher müssen Sie SQL-Code bereitstellen. Schau mal, hier http://support.microsoft.com/kb/168336. Es gibt verschiedene Methoden, um das Recodset zu öffnen. Einen schönen Tag noch. – dee

0

Mein Verständnis von temporären Tabellen ist, dass sie nur für die Verbindung verfügbar sind, die sie erstellt hat. In diesem Fall ist der Versuch, einen von einer anderen Verbindung zu trennen, unklug.

Die Fehlermeldung gibt nicht an, welche Codezeile das verursacht hat. In diesem Fall schlage ich vor, dass Sie Ihren Code stückweise testen. Beginnen Sie mit dem Erstellen der Verbindung. Dann öffne und schließe es. Dann beginne Dinge zu tun, während die Verbindung offen ist, aber eine Sache nach der anderen.

+0

In SQL Server ## temp_table ist eine globale temporäre Tabelle. Der Versuch, die Tabelle beim Start der Codeausführung zu löschen, stellt (abgesehen von den Rennbedingungen) sicher, dass der Code beim Versuch, eine Tabelle zu erstellen, die bereits existiert, nicht nachgibt. Es empfiehlt sich, die (wahrscheinlich nicht vorhandene) Tabelle zu löschen, bevor Sie sie erstellen. – Robino

Verwandte Themen