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

Come risolvere "istruzione EXECUTE non riuscita perché la sua clausola WITH RESULT SETS specificava 1 set di risultati..." in SQL ServerSQL Server

Se si verifica l'errore Msg 11535, livello 16 durante il tentativo di eseguire una procedura memorizzata, è perché non sono stati definiti set di risultati sufficienti in WITH RESULT SETS clausola.

Alcune stored procedure restituiscono più set di risultati. Quando si utilizza WITH RESULT SETS clausola, è necessario definire ogni set di risultati previsto. È necessario farlo anche se si desidera modificare solo la definizione di uno o alcuni dei set di risultati.

Per correggere questo errore, aggiungi semplicemente i set di risultati aggiuntivi a WITH RESULT SETS clausola, ciascuna separata da una virgola.

Puoi anche risolverlo rimuovendo il WITH RESULT SETS clausola, ma presumo che tu la stia utilizzando per un motivo (ad es. devi ridefinire il set di risultati restituito dalla procedura).

Esempio di codice che causa l'errore

Supponiamo di avere una procedura memorizzata che restituisce tre set di risultati.

EXEC sp_getCityStateCountryByCityId @CityId = 1;

Risultato:

+------------+----------------------------+-----------------------------+
| CityName   | LatestRecordedPopulation   | ValidFrom                   |
|------------+----------------------------+-----------------------------|
| Aaronsburg | 613                        | 2013-01-01 00:00:00.0000000 |
+------------+----------------------------+-----------------------------+
(1 row affected)
+---------------------+---------------------+----------------------------+
| StateProvinceCode   | StateProvinceName   | LatestRecordedPopulation   |
|---------------------+---------------------+----------------------------|
| PA                  | Pennsylvania        | 13284753                   |
+---------------------+---------------------+----------------------------+
(1 row affected)
+-----------------+---------------+----------------------------+
| IsoAlpha3Code   | CountryName   | LatestRecordedPopulation   |
|-----------------+---------------+----------------------------|
| USA             | United States | 313973000                  |
+-----------------+---------------+----------------------------+
(1 row affected)

E diciamo che vogliamo usare il WITH RESULT SETS clausola per ridefinire le colonne solo del primo set di risultati.

Farlo con il codice seguente produrrà un errore.

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

Risultato:

Msg 11535, Level 16, State 1, Procedure sp_getCityStateCountryByCityId, Line 14
EXECUTE statement failed because its WITH RESULT SETS clause specified 1 result set(s), and the statement tried to send more result sets than this.

Questo perché non abbiamo incluso gli altri set di risultati in WITH RESULT SETS clausola.

La soluzione

La soluzione è includere gli altri set di risultati in WITH RESULT SETS clausola.

EXEC sp_getCityStateCountryByCityId @CityId = 1
WITH RESULT SETS   
(  
    (
        [City] nvarchar(50),
        [Population] int,
        [Valid From] date
    ),
    (
        [State Code] nvarchar(5),
        [State Name] nvarchar(50),
        [Population] int
    ),
    (
        [Country Code] nvarchar(3),
        [Country Name] nvarchar(60),
        [Population] int
    )
);

Risultato:

+------------+--------------+--------------+
| City       | Population   | Valid From   |
|------------+--------------+--------------|
| Aaronsburg | 613          | 2013-01-01   |
+------------+--------------+--------------+
(1 row affected)
+--------------+--------------+--------------+
| State Code   | State Name   | Population   |
|--------------+--------------+--------------|
| PA           | Pennsylvania | 13284753     |
+--------------+--------------+--------------+
(1 row affected)
+----------------+----------------+--------------+
| Country Code   | Country Name   | Population   |
|----------------+----------------+--------------|
| USA            | United States  | 313973000    |
+----------------+----------------+--------------+
(1 row affected)

Il problema è stato risolto.