2011-12-31 13 views
6

Mam procedurę SQL, która zawsze zwraca polecenie "PRINT" i chcę wyodrębnić dane wyjściowe tego polecenia "PRINT", tj. Procedurę w języku C#, jak to zrobić? tutaj jest proceduraJak wyświetlić wynik polecenia SQL "PRINT" w języku 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

Możliwy duplikat [wydrukowanej procedury przechwyconej procedury przechwytywania w .NET] (http://stackoverflow.com/questions/1880471/capture-stored-procedure-print-output-innet) – dsolimano

Odpowiedz

17

Musisz zapisać się do SqlConnection.InfoMessage Event.

MSDN ma przykładowy kod here.

+0

czy to zadziała dla bazy danych innych niż serwer sql? –

+0

@BrijeshMishra - Brak 'SqlConnection' jest specyficzny dla SQL Server. Nie jestem pewien, czy inne RDBMS (inne niż Sybase) mają odpowiedniki "PRINT" tak czy inaczej ... –

3

Prawidłowym podejściem do tego jest zapisanie wartości w parametrze wyjściowym, a następnie w procedurze przechowywanej wydrukowanie wartości parametru wyjściowego.

Na przykład:

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) 

Następnie w kodzie, pobrać wartość parametru wyjściowego.

Aktualizacja

Powyższa propozycja będzie działać tylko wtedy, gdy jest tylko jeden komunikat o stanie lub błędzie, który jest zwracany. Przy bliższym przejrzeniu procedury przechowywanej zdałem sobie sprawę, że tak nie jest w przypadku tej procedury składowanej, ponieważ instrukcje drukowania są używane do zwracania danych do aplikacji wywołującej.

Teraz rozumiem tego, sugeruję, że jeśli to możliwe, procedura przechowywana być przepisana następująco:

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 

z tym, można po prostu przetwarzania zwróconych wierszy, które będą miały jedną kolumnę o nazwie wynik.

+0

Hmm, Nie spojrzałem na to, dlaczego chcieli to zrobić. "Właściwym" sposobem na wykonanie tego IMO byłoby zwrócenie prostego zestawu wyników z 2 kolumnami 'test, count' –

+0

@MartinSmith: Takie podejście może być problematyczne, jeśli ich zapytanie nie przynosi żadnych wyników lub jeśli zmienia je w przyszłość, aby uwzględnić wiele wyników. Zauważyłem, że jest znacznie bardziej niezawodny i przyszłościowy, aby zawrzeć w komunikacie komunikaty o statusie lub komunikaty o błędach, takie jak "poza pasmem". –

+0

To nie są komunikaty o stanie. Jest to jedyne dane zwrócone przez procedurę składowaną. –

Powiązane problemy