2011-12-31 7 views
6

tengo un procedimiento SQL que siempre devuelve el comando "IMPRIMIR" y quiero extraer el resultado de este comando "IMPRIMIR", es decir, el procedimiento en C# ¿cómo puedo hacer eso? Aquí está el procedimiento¿Cómo puedo visualizar el resultado del comando SQL "IMPRIMIR" en C#?

ALTER PROC ResultsPoll 
@pollid INT 
AS 
DECLARE @count1 INT 
DECLARE @count2 INT 
DECLARE @count3 INT 
DECLARE @count4 INT 
DECLARE @count5 INT 
DECLARE @test VARCHAR(MAX) 
DECLARE @value VARCHAR(MAX) 
SELECT @count1 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a1 
SELECT @count2 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a2 
SELECT @count3 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a3 
SELECT @count4 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a4 
SELECT @count5 = COUNT(mem_id) FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a5 

SELECT @test=Polls.a1 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count1 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a2 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count2 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a3 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count3 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a4 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count4 AS VARCHAR(MAX))) 
END 
SELECT @test=Polls.a5 FROM Polls WHERE poll_id = @pollid 
IF(@test IS NOT NULL) 
BEGIN 
PRINT ('Number of students who chose '[email protected]+' is:'+' '+CAST (@count5 AS VARCHAR(MAX))) 
END 
+1

Posible duplicado de [Capture Stored Procedure imprimir salida en .NET] (http://stackoverflow.com/questions/1880471/capture-stored-procedure-print-output-in-net) – dsolimano

Respuesta

17

debe suscribirse a la SqlConnection.InfoMessage Evento.

MSDN tiene un código de ejemplo here.

+0

Esto funcionará para otra base de datos que el servidor sql? –

+0

@BrijeshMishra - No 'SqlConnection' es específico para SQL Server. No estoy seguro si otros RDBMS (que no sean Sybase) tienen equivalentes a 'PRINT' de todos modos ... –

3

El enfoque adecuado para esto es registrar el valor en un parámetro de salida, luego en el procedimiento almacenado, imprimir el valor del parámetro de salida.

Por ejemplo:

ALTER PROC ResultsPoll 
@pollid INT , 
@message varchar(max) OUTPUT 
AS 
SET @message = '' 
... 
IF(@test IS NOT NULL) 
BEGIN 
SET @message = 'Number of students who chose '[email protected]+' is:'+' '+CAST (@count1 AS VARCHAR(MAX)) 
END 
... 

PRINT(@message) 

Luego, en el código, recuperar el valor del parámetro de salida.

actualización

La sugerencia anterior sólo funcionará si hay un único mensaje de estado o de error que se está devolviendo. Al examinar más de cerca el procedimiento almacenado, me di cuenta de que este no es el caso con este procedimiento almacenado, ya que las instrucciones de impresión se usan para devolver datos a la aplicación de llamada.

Ahora que entiendo esto, sugieren que, si es posible, el procedimiento almacenado puede reescribir de la siguiente manera:

ALTER PROC ResultsPoll 
@pollid INT 
AS 

SELECT result = 'Number of students who chose ' + MAX(Polls.a1) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a1 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a2) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a2 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a3) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a3 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a4) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a4 

UNION 

SELECT result = 'Number of students who chose ' + MAX(Polls.a5) + ' is: ' + CAST(COUNT(1) AS NVARCHAR(MAX)) 
    FROM Students_answer_Polls INNER JOIN Polls ON Polls.poll_id = Students_answer_Polls.poll_id 
WHERE Students_answer_Polls.poll_id = @pollid AND Students_answer_Polls.answer = Polls.a5 

Con esto, sólo puede procesar las filas devueltas, lo que tendrá una sola columna llamada resultado.

+0

Hmm, No había mirado por qué querían hacer esto. La forma "adecuada" de hacerlo sería obtener un resultado simple con 2 columnas 'test, count' –

+0

@MartinSmith: ese enfoque podría ser problemático si su consulta no arroja ningún resultado o si lo cambian en el futuro para incluir múltiples resultados. He encontrado que es mucho más confiable y seguro para el futuro incluir mensajes de estado o error como este "fuera de banda" en los parámetros. –

+0

Estos no son mensajes de estado. Este es el único dato devuelto por el procedimiento almacenado. –

Cuestiones relacionadas