9

Helo,SQL Server Stored Procedure valor de devolución de la tienda

Mi pregunta es Tengo un procedimiento almacenado en SQL Server que devuelve los recuentos de un campo. Quiero almacenar los resultados de este procedimiento almacenado en una variable (¿escalar?) De un procedimiento almacenado diferente.

sp_My_Other_SP: 

CREATE PROCEDURE [dbo].sp_My_Other_SP 
@variable int OUTPUT -- The returned count 
AS 

BEGIN -- SP 

SET NOCOUNT ON; 

SET @SQL = "SELECT COUNT(*) FROM blah" 
EXEC(@SQL) 

END -- SP 

que actualmente hago como:

DECLARE @count int 

EXEC sp_My_Other_SP @count OUTPUT 

Entonces lo uso como

IF (@count > 0) 
BEGIN 
... 
END 

Sin embargo, su regreso al otro procedimiento almacenado resultados, así como los principales resultados de procedimiento almacenado que es un problema en mi aplicación .NET.

----------- 
NoColName 
----------- 
14 

----------- 
MyCol 
----------- 
abc 
cde 
efg 

(anteriormente es un intento de representación de los conjuntos de resultados devueltos)

Me gustaría saber si hay una manera de almacenar los resultados de un procedimiento almacenado en una variable que no lo hace también la salida eso.

Gracias por cualquier ayuda.

+2

tendrá que mostrarnos más código ya que su pregunta no está clara. –

+0

Acepto ... nos muestran todo el contexto ... la llamada al "otro" procedimiento almacenado. – madcolor

+0

El problema es que el sproc que devuelve el conteo incluye más que eso en su conjunto de resultados, y esta salida está apareciendo en el segundo sproc. –

Respuesta

12

Puede capturar los resultados del procedimiento almacenado en una tabla temporal por lo que no es devuelto por el procedimiento de llamada almacenada.

create table #temp (id int, val varchar(100)) 
insert into #temp 
exec sp_My_Other_SP @value, @value, @value, @count OUTPUT 
+2

He utilizado este enfoque, pero en lugar de una tabla hash He utilizado el tipo de tabla escalar como: DECLARE @temp_tbl TABLA (int value) INSERT INTO @temp_tbl EXEC sp_My_SP \t \t \t SET @count = (SELECT TOP 1 value FROM @temp_tbl) – Phil

+0

Esto es, por supuesto, menos eficiente ya que está seleccionando datos que no le importan. Sería mejor que añadieras un nuevo parámetro a sp_My_Other_SP que controle si el conjunto de resultados se devuelve o no si solo buscas un conteo. –

+0

Eso no tiene sentido, me importa el conteo ya que siempre lo usaré y es vital para el resto del SP. – Phil

4

Bueno, la manera más fácil de arreglar esto es recodificar el proceso almacenado para que la instrucción select que devuelve el conjunto de resultados 'otros' que no desea en este caso se expida condicionalmente, solo cuando NO está pidiendo el recuento

Agregar otro parámetro llamado @GetCount

@GetCount TinyInt Defualt = 0 // or 
@GetCount Bit Default = 0 

Entonces en lugar de sólo

Select ... 

escritura

If @GetCount = 1 
    Select ... 
2

Ha intentado cambiar

SET @SQL = "SELECT COUNT(*) FROM blah" 
EXEC(@SQL) 

a

SELECT @variable = COUNT(*) FROM blah" 
-- don't do EXEC(@SQL) 

?

0
THE FIRST PROCEDURE: 
CREATE PROC DD43 
@ID INT OUTPUT AS 
(SELECT @ID=COUNT(*) FROM CS2) 

SECOND PROCEDURE: 

CREATE PROC DD45 AS 
DECLARE @COUNT INT 
DECLARE @COUN INT 
EXEC DD43 @COUN OUT --CALLING THE FIRST PROCEDURE 
SET @COUNT= (SELECT @COUN) 
SELECT @COUNT 

EXEC DD45 
+2

Si bien este código puede responder la pregunta, sería mejor explicar cómo se resuelve el problema y por qué usarlo. Las respuestas de solo código no son útiles a largo plazo. –

Cuestiones relacionadas