Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak naprawić „wyrażenie EXECUTE nie powiodło się, ponieważ jego klauzula WITH RESULT SETS określono 2 kolumny dla zestawu wyników…” Msg 11537 w programie SQL Server

Jeśli napotkasz błąd Msg 11537, poziom 16 w SQL Server, prawdopodobnie próbujesz wykonać procedurę składowaną przy użyciu WITH RESULT SETS klauzula, ale nie uwzględniłeś wszystkich kolumn w swojej definicji.

Gdy używasz WITH RESULT SETS klauzula w EXECUTE /EXEC instrukcji, należy podać definicję dla wszystkich kolumn zwracanych przez procedurę składowaną. Jeśli tego nie zrobisz, otrzymasz ten błąd.

Przykład

Poniższa procedura składowana zwraca trzy kolumny.

EXEC sp_getCityById @CityId = 1;

Wynik:

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

Załóżmy teraz, że chcemy przedefiniować niektóre kolumny. Możemy użyć WITH RESULT SETS klauzula, aby to zrobić.

Kod problemu

Ale jeśli nie uwzględnimy wszystkich trzech kolumn w tej klauzuli, otrzymamy błąd.

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

Wynik:

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.

Komunikat o błędzie informuje nas, ile kolumn określiliśmy i ile zostało wysłanych przez procedurę składowaną.

W tym przypadku określiliśmy dwie kolumny, ale procedura wysłana trzy.

Dobry kod

Możemy rozwiązać ten problem, dołączając trzecią kolumnę.

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

Wynik:

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd zapytania z niejednoznaczną nazwą kolumny w SQL

  2. Count(*) vs Count(1) — SQL Server

  3. Najlepsze opcje monitorowania bazy danych dostępne dla Twojej firmy

  4. Jaki jest najdłuższy możliwy numer telefonu na świecie, który powinienem wziąć pod uwagę w SQL varchar (długość) dla telefonu?

  5. Najlepszy sposób na przechowywanie czasu (gg:mm) w bazie danych