sql >> Database >  >> RDS >> Sqlserver

Het gebruik van OPENQUERY (exec-opgeslagen procedure) om een ​​nieuwe tijdelijke tabel te maken mislukt met fout 11526

Probeer dit:

SELECT *
FROM OPENQUERY("FOO\SQL2012", 'SET FMTONLY OFF; EXEC mySchema.myStoredProc;') X;

De reden hiervoor is dat wanneer u een opgeslagen procedure uitvoert op een gekoppelde server, de provider eerst probeert de vorm van de resulterende rijenset te bepalen. Het doet dit door SET FMTONLY ON; en vervolgens uw verklaring uitvoeren. In een opgeslagen procedure die geen tijdelijke tabellen gebruikt, werkt dit prachtig. De query-parser voert in feite een test uit zonder alle gegevens op te halen, alleen de metagegevens (een beetje zoals het tonen van een geschat uitvoeringsplan).

Het probleem is dat wanneer de opgeslagen procedure doet gebruik tijdelijke tabellen, het mislukt, omdat de metagegevens van de tijdelijke tabel niet bestaan:het kan niet worden verzameld via de meta-analyse die werkt voor opgeslagen procedures die geen tijdelijke tabellen gebruiken. De remedie is dan om handmatig SET FMTONLY OFF; binnen de batch die de opgeslagen procedure uitvoert.

Houd er rekening mee dat het gebruik van deze methode ervoor zorgt dat de opgeslagen procedure twee keer wordt uitgevoerd . De eerste keer om de metadata te verzamelen (de gegevens worden weggegooid) en de tweede keer om de gegevens daadwerkelijk terug te geven. Als de opgeroepen opgeslagen procedure bijzonder kostbaar is of bijwerkingen heeft, moet u mogelijk rekening houden met.

Merk ten slotte op dat deze truc niet bij elke opgeslagen procedure werkt. Er zijn dingen die opgeslagen procedures kunnen doen die gewoon een moersleutel in de werken gooien. Ik ken niet alle mogelijkheden, maar een daarvan is het retourneren van meerdere recordsets.

Als reactie op uw update dat SET FMTONLY OFF werkt niet:kunt u uw SP eventueel herstructureren om geen tijdelijke tabel te gebruiken, of om een ​​permanente tabel met sessiesleutels te gebruiken? Elk van deze opties zou het werk kunnen doen. In SQL Server 2012 hebt u ook de mogelijkheid om gegevens door te geven met table- gewaardeerde parameters .

Misschien wil je Erland Sommarskog's Hoe gegevens delen tussen opgeslagen procedures lezen omdat het je inspiratie kan bieden voor een manier om je doel te bereiken.



  1. voeg `id` autoincrement primaire sleutelveld expliciet in laravel 5.2 in

  2. Wat doet een transactie rond een enkel overzicht?

  3. Flask:sqlalchemy.exc.ProgrammingError:(psycopg2.ProgrammingError) relatie gebruikers bestaat niet

  4. .NET-configuratie uit database lezen