Devolver un solo conjunto de resultados

12/06/2006 - 19:40 por Raipon | Informe spam
Hola, tengo el siguiente procedimiento almacenado :

ALTER PROCEDURE [dbo].[sp_Dies_de_baixa]

As

SET NOCOUNT ON

DECLARE @Camps NVarChar (2000)
DECLARE @PIVOT NVarChar (1500)
DECLARE @Exercici int
DECLARE Baixes_Cursor CURSOR FOR

SELECT Year(Data) AS Exercici
FROM (DetallsHoraris INNER JOIN TítolHoraris ON
DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat
Where Estat = 0
GROUP BY Year(Data)

OPEN Baixes_Cursor;

FETCH FROM Baixes_Cursor
Into @Exercici
Set @Camps = '['+ Convert(NVarchar, @Exercici) + '] As Exercici_' +
Convert(NVarchar, @Exercici)
Set @Pivot = '['+ Convert(NVarchar, @Exercici) + ']'

FETCH NEXT FROM Baixes_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH FROM Baixes_Cursor
Into @Exercici
Set @Camps = @Camps + ', ['+ Convert(NVarchar, @Exercici) + '] As
Exercici_' + Convert(NVarchar, @Exercici)
Set @Pivot = @Pivot + ', ['+ Convert(NVarchar, @Exercici) + ']'
END;

CLOSE Baixes_Cursor;
DEALLOCATE Baixes_Cursor;

Execute (N'SELECT Nom, ' + @Camps +
' FROM
(SELECT Nom, Year(Data) AS Exercici
FROM (DetallsHoraris INNER JOIN TítolHoraris ON
DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat Where Estat = 0) p
PIVOT
(
COUNT (Exercici)
FOR Exercici IN
( ' + @Pivot + ' )
) AS pvt
ORDER BY Nom'
)

El objetivo es obtener, de forma análoga a las consultas de referencias
cruzadas de Access un listado con un número variable de columnas, en este
caso, una por año. El problema, y perdón si es algo trivial, es que este
procedimiento me devuelve dos conjuntos de resultados : El primero : Exercici
= Null, y el segundo son los resultados de Execute. Y yo necesito que sólo me
devuelva los resultados del Execute. ¿ Cómo puedo hacerlo ?

Gracias por la atención.

Preguntas similare

Leer las respuestas

#1 Ele
13/06/2006 - 01:06 | Informe spam
Hola el 08 de junio 2006 marco anuncio el post consulta de referencias
cruzadas quiza es es lo que estas buscando por lo que entiendo a tu problema

"Raipon" escribió en el mensaje
news:
Hola, tengo el siguiente procedimiento almacenado :

ALTER PROCEDURE [dbo].[sp_Dies_de_baixa]

As

SET NOCOUNT ON

DECLARE @Camps NVarChar (2000)
DECLARE @PIVOT NVarChar (1500)
DECLARE @Exercici int
DECLARE Baixes_Cursor CURSOR FOR

SELECT Year(Data) AS Exercici
FROM (DetallsHoraris INNER JOIN TítolHoraris ON
DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat
Where Estat = 0
GROUP BY Year(Data)

OPEN Baixes_Cursor;

FETCH FROM Baixes_Cursor
Into @Exercici
Set @Camps = '['+ Convert(NVarchar, @Exercici) + '] As Exercici_' +
Convert(NVarchar, @Exercici)
Set @Pivot = '['+ Convert(NVarchar, @Exercici) + ']'

FETCH NEXT FROM Baixes_Cursor;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH FROM Baixes_Cursor
Into @Exercici
Set @Camps = @Camps + ', ['+ Convert(NVarchar, @Exercici) + '] As
Exercici_' + Convert(NVarchar, @Exercici)
Set @Pivot = @Pivot + ', ['+ Convert(NVarchar, @Exercici) + ']'
END;

CLOSE Baixes_Cursor;
DEALLOCATE Baixes_Cursor;

Execute (N'SELECT Nom, ' + @Camps +
' FROM
(SELECT Nom, Year(Data) AS Exercici
FROM (DetallsHoraris INNER JOIN TítolHoraris ON
DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat Where Estat = 0) p
PIVOT
(
COUNT (Exercici)
FOR Exercici IN
( ' + @Pivot + ' )
) AS pvt
ORDER BY Nom'
)

El objetivo es obtener, de forma análoga a las consultas de referencias
cruzadas de Access un listado con un número variable de columnas, en este
caso, una por año. El problema, y perdón si es algo trivial, es que este
procedimiento me devuelve dos conjuntos de resultados : El primero :
Exercici
= Null, y el segundo son los resultados de Execute. Y yo necesito que sólo
me
devuelva los resultados del Execute. ¿ Cómo puedo hacerlo ?

Gracias por la atención.
Respuesta Responder a este mensaje
#2 Raipon
13/06/2006 - 10:23 | Informe spam
Hola, muchas gracias por responder. Interesante el link que me comentas. De
nuevo gracias.
Aun y así, persiste mi duda : En el caso de que un store procedure devuelva
más de un conjunto de resultados, siendo necesario pasar una variable de un
lote de instrucciones a otro (por lo que no puedo usar 'Go'), ... ¿ puedo
forzar a que se devuelva solo el último conjunto de resultados ?

"Ele" wrote:

Hola el 08 de junio 2006 marco anuncio el post consulta de referencias
cruzadas quiza es es lo que estas buscando por lo que entiendo a tu problema

"Raipon" escribió en el mensaje
news:
> Hola, tengo el siguiente procedimiento almacenado :
>
> ALTER PROCEDURE [dbo].[sp_Dies_de_baixa]
>
> As
>
> SET NOCOUNT ON
>
> DECLARE @Camps NVarChar (2000)
> DECLARE @PIVOT NVarChar (1500)
> DECLARE @Exercici int
> DECLARE Baixes_Cursor CURSOR FOR
>
> SELECT Year(Data) AS Exercici
> FROM (DetallsHoraris INNER JOIN TítolHoraris ON
> DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
> Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat
> Where Estat = 0
> GROUP BY Year(Data)
>
> OPEN Baixes_Cursor;
>
> FETCH FROM Baixes_Cursor
> Into @Exercici
> Set @Camps = '['+ Convert(NVarchar, @Exercici) + '] As Exercici_' +
> Convert(NVarchar, @Exercici)
> Set @Pivot = '['+ Convert(NVarchar, @Exercici) + ']'
>
> FETCH NEXT FROM Baixes_Cursor;
> WHILE @@FETCH_STATUS = 0
> BEGIN
> FETCH FROM Baixes_Cursor
> Into @Exercici
> Set @Camps = @Camps + ', ['+ Convert(NVarchar, @Exercici) + '] As
> Exercici_' + Convert(NVarchar, @Exercici)
> Set @Pivot = @Pivot + ', ['+ Convert(NVarchar, @Exercici) + ']'
> END;
>
> CLOSE Baixes_Cursor;
> DEALLOCATE Baixes_Cursor;
>
> Execute (N'SELECT Nom, ' + @Camps +
> ' FROM
> (SELECT Nom, Year(Data) AS Exercici
> FROM (DetallsHoraris INNER JOIN TítolHoraris ON
> DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
> Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat Where Estat = 0) p
> PIVOT
> (
> COUNT (Exercici)
> FOR Exercici IN
> ( ' + @Pivot + ' )
> ) AS pvt
> ORDER BY Nom'
> )
>
> El objetivo es obtener, de forma análoga a las consultas de referencias
> cruzadas de Access un listado con un número variable de columnas, en este
> caso, una por año. El problema, y perdón si es algo trivial, es que este
> procedimiento me devuelve dos conjuntos de resultados : El primero :
> Exercici
> = Null, y el segundo son los resultados de Execute. Y yo necesito que sólo
> me
> devuelva los resultados del Execute. ¿ Cómo puedo hacerlo ?
>
> Gracias por la atención.



Respuesta Responder a este mensaje
#3 qwalgrande
14/06/2006 - 07:40 | Informe spam
Hola.

Para conseguirlo, no devuelvas más de un recordset en tu procedimiento.
Puedes asignar a variables (que no uses) los valores o simplemente evitar
lanzar esas consultas que no vas a recoger después.

Alberto López Grande (qwalgrande)


"Raipon" escribió en el mensaje
news:
Hola, muchas gracias por responder. Interesante el link que me comentas.
De
nuevo gracias.
Aun y así, persiste mi duda : En el caso de que un store procedure
devuelva
más de un conjunto de resultados, siendo necesario pasar una variable de
un
lote de instrucciones a otro (por lo que no puedo usar 'Go'), ... ¿ puedo
forzar a que se devuelva solo el último conjunto de resultados ?

"Ele" wrote:

Hola el 08 de junio 2006 marco anuncio el post consulta de referencias
cruzadas quiza es es lo que estas buscando por lo que entiendo a tu
problema

"Raipon" escribió en el mensaje
news:
> Hola, tengo el siguiente procedimiento almacenado :
>
> ALTER PROCEDURE [dbo].[sp_Dies_de_baixa]
>
> As
>
> SET NOCOUNT ON
>
> DECLARE @Camps NVarChar (2000)
> DECLARE @PIVOT NVarChar (1500)
> DECLARE @Exercici int
> DECLARE Baixes_Cursor CURSOR FOR
>
> SELECT Year(Data) AS Exercici
> FROM (DetallsHoraris INNER JOIN TítolHoraris ON
> DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
> Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat
> Where Estat = 0
> GROUP BY Year(Data)
>
> OPEN Baixes_Cursor;
>
> FETCH FROM Baixes_Cursor
> Into @Exercici
> Set @Camps = '['+ Convert(NVarchar, @Exercici) + '] As Exercici_' +
> Convert(NVarchar, @Exercici)
> Set @Pivot = '['+ Convert(NVarchar, @Exercici) + ']'
>
> FETCH NEXT FROM Baixes_Cursor;
> WHILE @@FETCH_STATUS = 0
> BEGIN
> FETCH FROM Baixes_Cursor
> Into @Exercici
> Set @Camps = @Camps + ', ['+ Convert(NVarchar, @Exercici) + '] As
> Exercici_' + Convert(NVarchar, @Exercici)
> Set @Pivot = @Pivot + ', ['+ Convert(NVarchar, @Exercici) + ']'
> END;
>
> CLOSE Baixes_Cursor;
> DEALLOCATE Baixes_Cursor;
>
> Execute (N'SELECT Nom, ' + @Camps +
> ' FROM
> (SELECT Nom, Year(Data) AS Exercici
> FROM (DetallsHoraris INNER JOIN TítolHoraris ON
> DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
> Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat Where Estat =
> 0) p
> PIVOT
> (
> COUNT (Exercici)
> FOR Exercici IN
> ( ' + @Pivot + ' )
> ) AS pvt
> ORDER BY Nom'
> )
>
> El objetivo es obtener, de forma análoga a las consultas de referencias
> cruzadas de Access un listado con un número variable de columnas, en
> este
> caso, una por año. El problema, y perdón si es algo trivial, es que
> este
> procedimiento me devuelve dos conjuntos de resultados : El primero :
> Exercici
> = Null, y el segundo son los resultados de Execute. Y yo necesito que
> sólo
> me
> devuelva los resultados del Execute. ¿ Cómo puedo hacerlo ?
>
> Gracias por la atención.



Respuesta Responder a este mensaje
#4 Ele
14/06/2006 - 16:40 | Informe spam
Tal como te dice Alberto te devuelve lo que tiene el resultado del query ya
hiciste una prueba por aparte con ese select cuantos registros devuelve?

"Raipon" escribió en el mensaje
news:
Hola, muchas gracias por responder. Interesante el link que me comentas.
De
nuevo gracias.
Aun y así, persiste mi duda : En el caso de que un store procedure
devuelva
más de un conjunto de resultados, siendo necesario pasar una variable de
un
lote de instrucciones a otro (por lo que no puedo usar 'Go'), ... ¿ puedo
forzar a que se devuelva solo el último conjunto de resultados ?

"Ele" wrote:

Hola el 08 de junio 2006 marco anuncio el post consulta de referencias
cruzadas quiza es es lo que estas buscando por lo que entiendo a tu
problema

"Raipon" escribió en el mensaje
news:
> Hola, tengo el siguiente procedimiento almacenado :
>
> ALTER PROCEDURE [dbo].[sp_Dies_de_baixa]
>
> As
>
> SET NOCOUNT ON
>
> DECLARE @Camps NVarChar (2000)
> DECLARE @PIVOT NVarChar (1500)
> DECLARE @Exercici int
> DECLARE Baixes_Cursor CURSOR FOR
>
> SELECT Year(Data) AS Exercici
> FROM (DetallsHoraris INNER JOIN TítolHoraris ON
> DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
> Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat
> Where Estat = 0
> GROUP BY Year(Data)
>
> OPEN Baixes_Cursor;
>
> FETCH FROM Baixes_Cursor
> Into @Exercici
> Set @Camps = '['+ Convert(NVarchar, @Exercici) + '] As Exercici_' +
> Convert(NVarchar, @Exercici)
> Set @Pivot = '['+ Convert(NVarchar, @Exercici) + ']'
>
> FETCH NEXT FROM Baixes_Cursor;
> WHILE @@FETCH_STATUS = 0
> BEGIN
> FETCH FROM Baixes_Cursor
> Into @Exercici
> Set @Camps = @Camps + ', ['+ Convert(NVarchar, @Exercici) + '] As
> Exercici_' + Convert(NVarchar, @Exercici)
> Set @Pivot = @Pivot + ', ['+ Convert(NVarchar, @Exercici) + ']'
> END;
>
> CLOSE Baixes_Cursor;
> DEALLOCATE Baixes_Cursor;
>
> Execute (N'SELECT Nom, ' + @Camps +
> ' FROM
> (SELECT Nom, Year(Data) AS Exercici
> FROM (DetallsHoraris INNER JOIN TítolHoraris ON
> DetallsHoraris.IdTítolHorari = TítolHoraris.IdTítolHoraris) INNER JOIN
> Empleats ON TítolHoraris.IdEmpleat = Empleats.IdEmpleat Where Estat =
> 0) p
> PIVOT
> (
> COUNT (Exercici)
> FOR Exercici IN
> ( ' + @Pivot + ' )
> ) AS pvt
> ORDER BY Nom'
> )
>
> El objetivo es obtener, de forma análoga a las consultas de referencias
> cruzadas de Access un listado con un número variable de columnas, en
> este
> caso, una por año. El problema, y perdón si es algo trivial, es que
> este
> procedimiento me devuelve dos conjuntos de resultados : El primero :
> Exercici
> = Null, y el segundo son los resultados de Execute. Y yo necesito que
> sólo
> me
> devuelva los resultados del Execute. ¿ Cómo puedo hacerlo ?
>
> Gracias por la atención.



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida