Dynamic SQL gibt keine Ergebnisse in Access Pass-Through-Abfrage zurück

Betrachten Sie den folgenden Code.

DECLARE @sql VARCHAR(MAX) SELECT @sql = 'SELECT * FROM caseinformation' EXEC(@sql) 

Wenn ich das in SSMS laufe, zeigt es die gleichen Ergebnisse an, wie es hätte ich SELECT * FROM caseinformation laufen SELECT * FROM caseinformation . Aber wenn ich das als Access Pass-Through-Abfrage ausführe, bekomme ich folgende Fehlermeldung:

Pass-Through-Abfrage mit ReturnsRecords-Eigenschaft, die auf True gesetzt wurde, hat keine datasätze zurückgegeben.

Was gibt?

   

Fügen Sie am Anfang Ihrer dynamischen Pass-Through-Abfrage Folgendes hinzu:

 SET NoCount ON 

und Sie können die Abfrage von MS Access verwenden.

Warum das funktioniert, muss ich für andere zu erklären, aber ich weiß, dass es funktioniert.

Diese Erklärung ist falsch:

Die Aussage, die Access beschwert hat, war eigentlich dein SELECT @sql =, das wie eine select-statement aussieht, aber kein datasatz zurückgibt. Wenn Sie SET NOCOUNT ON sagen, deaktiviert dies die ReturnsRecords-Eigenschaft, die Access verursacht, um die Abfrage zu fehlschlagen.

… wie ist das nicht was passiert

Eine genauere Erklärung ist, dass SQL server mehrere Resultsets aus einem Abfrage- oder gespeicherten Prozeduraufruf zurückgeben kann. Diese Ergebnismengen sind nicht alle Recordsets und können eine Mischung aus Skalarwerten und Rowsets sein. Wenn Set NoCount ausgeschaltet ist, gibt SQL server nacheinander das Rowset und dann die Anzahl der datasätze BOTH an den aufrufenden Code zurück. Da VBA nicht nach dieser komplexen Mischung von Skalar- und Recordset-Rückgabewerten sucht, ergibt sich der ursprüngliche Fehler (weil der Skalarwert tatsächlich am TOP der Ergebnismengen, dh FIRST, zurückgegeben wird).

Wenn das Set NoCount ON auf SQL server ausgeführt wird, sagt dies SQL server einfach nicht, die Zählung als Teil des Resultsets zurückzugeben. Dies führt dazu, dass Access / VBA / DAO das Resultset als Recordset erkennen kann (auch wenn es sich um ein mehrfaches Recordset handelt), und dann funktioniert alles wie erwartet.

versuchen Sie, Ihre Spalten anstelle von *