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

Sådan rettes "EXECUTE-sætningen mislykkedes, fordi dens WITH RESULT SETS-klausul specificerede 2 kolonne(r) for resultatsæt..." Meddelelse 11537 i SQL Server

Hvis du støder på fejlmeddelelse 11537, niveau 16 i SQL Server, er chancerne for, at du forsøger at udføre en lagret procedure ved at bruge WITH RESULT SETS klausul, men du har ikke inkluderet alle kolonnerne i din definition.

Når du bruger WITH RESULT SETS klausul i EXECUTE /EXEC sætning, skal du angive en definition for alle kolonner, der returneres af den lagrede procedure. Hvis du ikke gør det, får du denne fejl.

Eksempel

Den følgende lagrede procedure returnerer tre kolonner.

EXEC sp_getCityById @CityId = 1;

Resultat:

+------------+----------------------------+-----------------------------+
| CityName   | LatestRecordedPopulation   | ValidFrom                   |
|------------+----------------------------+-----------------------------|
| Aaronsburg | 613                        | 2013-01-01 00:00:00.0000000 |
+------------+----------------------------+-----------------------------+

Antag nu, at vi vil omdefinere nogle af kolonnerne. Vi kan bruge WITH RESULT SETS klausul for at gøre det.

Problemkode

Men hvis vi ikke inkluderer alle tre kolonner i denne klausul, får vi en fejl.

EXEC sp_getCityById @CityId = 1
    WITH RESULT SETS   
    (  
        (
            [City] nvarchar(50),
            [Population] int
        )
    );

Resultat:

Msg 11537, Level 16, State 1, Procedure sp_getCityById, Line 5
EXECUTE statement failed because its WITH RESULT SETS clause specified 2 column(s) for result set number 1, but the statement sent 3 column(s) at run time.

Fejlmeddelelsen fortæller os, hvor mange kolonner vi har angivet, og hvor mange der blev sendt af den lagrede procedure.

I dette tilfælde specificerede vi to kolonner, men proceduren sendte tre.

God kode

Vi kan løse dette problem ved at inkludere den tredje kolonne.

EXEC sp_getCityById @CityId = 1
    WITH RESULT SETS   
    (  
        (
            [City] nvarchar(50),
            [Population] int,
            [Valid From] date
        )
    );

Resultat:

------------+--------------+--------------+
| City       | Population   | Valid From   |
|------------+--------------+--------------|
| Aaronsburg | 613          | 2013-01-01   |
+------------+--------------+--------------+

  1. Sådan vælger du dato uden tid i SQL

  2. Fix "Kan ikke installere i Homebrew på ARM-processor i Intels standardpræfiks (/usr/local)!"

  3. Sådan implementerer du nemt TimescaleDB

  4. MariaDB LOCALTIME() Forklaret