sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af OPENQUERY (exec lagret procedure) til at oprette ny midlertidig tabel mislykkes med fejl 11526

Prøv dette:

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

Årsagen til dette er, at når du udfører en lagret procedure på tværs af en forbundet server, forsøger udbyderen først at bestemme formen på det resulterende rækkesæt. Det gør den ved at udstede SET FMTONLY ON; og derefter køre din erklæring. I en lagret procedure, der ikke bruger temp-tabeller, fungerer dette smukt. Forespørgselsparseren udfører dybest set en tør kørsel uden faktisk at hente alle dataene, kun metadataene (som en estimeret eksekveringsplan).

Problemet er, at når den lagrede procedure gør bruge temp-tabeller, mislykkes det, fordi temp-tabellens metadata ikke eksisterer:det kan ikke indsamles gennem meta-analysen, der virker for lagrede procedurer, der ikke bruger temp-tabeller. Løsningen er derfor manuelt at SET FMTONLY OFF; inden for den batch, der udfører den lagrede procedure.

Vær opmærksom på, at brug af denne metode vil få den lagrede procedure til at køre to gange . Første gang for at indsamle metadata (de data, der kasseres), og anden gang for faktisk at returnere dataene. Hvis den kaldte lagrede procedure er særlig dyr eller har bivirkninger, skal du muligvis tage højde for det.

Bemærk endelig, at dette trick ikke virker på alle lagrede procedurer. Der er ting, lagrede procedurer kan gøre, der bare kaster en skruenøgle i gang. Jeg kender ikke alle mulighederne, men en af ​​dem er at returnere flere rekordsæt.

Som svar på din opdatering, SET FMTONLY OFF virker ikke:kan du eventuelt omstrukturere din SP til ikke at bruge en midlertidig tabel, eller til at bruge en sessionsnøglet permanent tabel? Hver af disse muligheder kunne gøre jobbet. I SQL Server 2012 har du også mulighed for at videregive data med table- værdisatte parametre .

Du vil måske gerne læse Erland Sommarskogs Sådan deler du data mellem lagrede procedurer da det kan give dig inspiration til en måde at nå dit formål på.



  1. ODBC 5.1-forbindelsesstreng til MySQL med skrivebeskyttet adgang

  2. Rangering af funktioner i SQL Server

  3. Opdatering af identitetskolonne i en tabel med fortløbende numre gennem SQL Stored Procedure

  4. MySQL:Langt bord vs bredt bord