2009-09-18 20 views
12
CREATE PROCEDURE [test].[proc] 
@ConfiguredContentId int, 
@NumberOfGames int 
AS 
BEGIN 
SET NOCOUNT ON 
RETURN 
@WunNumbers TABLE (WinNumb int) 

    INSERT INTO @WunNumbers (WinNumb) 
SELECT TOP (@NumberOfGames) WinningNumber 
FROM [Game].[Game] g 
JOIN [Game].[RouletteResult] AS rr ON g.[Id] = rr.[gameId] 
WHERE g.[ConfiguredContentId] = @ConfiguredContentId 
ORDER BY g.[Stoptime] DESC 

SELECT WinNumb, COUNT (WinNumb) AS "Count" 
FROM @WunNumbers wn 
GROUP BY wn.[WinNumb] 
END 
GO 

Ta procedura składowana zwraca wartości z pierwszej instrukcji select, ale chciałbym, aby wartości z drugiej instrukcji select zostały zwrócone. Tabela @WunNumbers to tabela tymczasowa.Jak zwrócić tabelę tymczasową z procedury składowanej

Jakieś pomysły ???

+0

proszę ponownie sformatować swój kod SQL. –

+0

Ten kod jest nieprawidłowy SQL. Być może, jeśli "RETURN @WinNumbers" był "DECLARE @WinNumbers", ale wtedy reszta wygląda dobrze, aby zwrócić ostateczny zestaw wyników –

+0

widzę teraz, wysłałem zły kod. Jest "DECLARE @WinNumbers", ale nadal nie działa. – dani

Odpowiedz

6

Jakiej wersji programu SQL Server używasz? W SQL Server 2008 można użyć Table Parameters and Table Types.

Alternatywnym podejściem jest zwrócenie zmiennej tabeli z funkcji zdefiniowanej przez użytkownika, ale nie jestem wielkim fanem tej metody.

można znaleźć przykład here

+0

Używam serwera sql 2005 – dani

25

Spójrz na ten kod,

CREATE PROCEDURE Test 

AS 
    DECLARE @tab table (no int, name varchar(30)) 

    insert @tab select eno,ename from emp 

    select * from @tab 
RETURN 
+0

Jak to zwróci/wyświetli zmienną tabeli dla dzwoniącego? Aktualnie zwraca zestaw wyników. –

+3

Zwraca wynik instrukcji select (rzeczywiste pytanie), która w tym przypadku jest zawartością zmiennej tabeli lokalnej @tab. – JeffO

+5

jeśli zrobię polecenie "WYKONAJ Test", w jaki sposób uzyskać dostęp do @tab? – whytheq

0

Typ zwracany procedury int.

Można również powrócić zestawów wyników (jak Twój kod aktualnie robi) (w porządku, można również wysyłać wiadomości, które są ciągi)

Są to jedyne „zwraca” można zrobić. Podczas dodawania parametrów z wartościami przechowywanymi w tabeli do procedury (patrz BOL), są one tylko wejściowe.

Edit:

(lub inny plakat wspomniano, można również użyć tabeli Ceniona funkcji, zamiast procedury)

2

temp tabeli mogą być tworzone w rozmówcy, a następnie wypełniane zwany SP.

create table #GetValuesOutputTable(
    ... 
); 

    exec GetValues; -- populates #GetValuesOutputTable 

    select * from #GetValuesOutputTable; 

Zaletą tego podejścia w stosunku do "insert exec" jest to, że można go zagnieździć i można go wykorzystać jako wejście lub wyjście.

Niektóre wady polegają na tym, że "argument" nie jest publiczny, tworzenie tabeli istnieje w każdym wywołującym i że nazwa tabeli może kolidować z innymi obiektami tymczasowymi. Pomaga, gdy nazwa tabeli tymczasowej jest ściśle zgodna z nazwą SP i jest zgodna z niektórymi konwencjami.

Przyjmując to nieco dalej, dla tabel z danymi wyjściowymi tylko do obliczeń, metoda insert-exec i podejście z tabelą tymczasową mogą być obsługiwane jednocześnie przez wywoływany SP. Nie pomaga to zbytnio w łańcuchach SP, ponieważ tabela wciąż musi być zdefiniowana w wywołującym, ale może pomóc uprościć testowanie z linii cmd lub podczas wywoływania na zewnątrz.

-- The "called" SP 
    declare 
     @returnAsSelect bit = 0; 

    if object_id('tempdb..#GetValuesOutputTable') is null 
    begin 
     set @returnAsSelect = 1; 
     create table #GetValuesOutputTable(
     ... 
    ); 
    end 

    -- populate the table 

    if @returnAsSelect = 1 
     select * from #GetValuesOutputTable; 
0

TAK MOŻESZ.

W swojej przechowywanej procedurze wypełnia się tabelę @tbRetour.

Na samym końcu procedury przechowywanej, piszesz:

SELECT * FROM @tbRetour 

Aby wykonać procedurę przechowywaną, piszesz:

USE [...] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[getEnregistrementWithDetails] 
@id_enregistrement_entete = '(guid)' 

GO 
0

pierwsze stworzyć prawdziwe, trwałe tabeli jako szablonu ma wymagany układ dla zwróconej tabeli tymczasowej, używając konwencji nazewnictwa, która identyfikuje ją jako szablon i łączy symbolicznie z SP, np. tmp_SPName_Output. Ta tabela nigdy nie zawiera żadnych danych.

W SP użyj INSERT, aby załadować dane do tabeli tymczasowej zgodnie z tą samą konwencją nazewnictwa, np. #SPName_Output który prawdopodobnie istnieje. Możesz przetestować jego istnienie i zwrócić błąd, jeśli tak się nie stanie.

Przed wywołaniem korzystanie sp ten prosty Wybierz, aby utworzyć tabelę temp:

SELECT TOP(0) * INTO #SPName_Output FROM tmp_SPName_Output; 
EXEC SPName; 
-- Now process records in #SPName_Output; 

ten ma następujące wyraźne zalety:

  • tabela temp jest lokalna dla bieżącej sesji, w przeciwieństwie do ## , więc nie będzie kolidować z jednoczesnymi połączeniami do SP z różnych sesji. Jest również automatycznie usuwany, gdy jest poza zasięgiem.
  • Tabela szablonów jest przechowywana obok SP, więc jeśli zmiany są wprowadzone do wyjścia (na przykład dodane nowe kolumny), wówczas istniejący wywołujący SP nie pękają. Dzwoniącego nie trzeba zmieniać.
  • Możesz zdefiniować dowolną liczbę tabel wyjściowych z różnymi nazwami dla jeden SP i wypełnić je wszystkie. Można również zdefiniować alternatywne wyjścia z różnymi nazwami i mieć SP sprawdzić istnienie tabel temp , aby zobaczyć, które muszą być wypełnione.
  • Podobnie, jeśli dokonania istotnych zmian, ale chcesz zachować wsteczną kompatybilności, można mieć nową tabelę szablonu i nazewnictwa dla późniejszego wersji, ale nadal wspierać wcześniejszą wersję, sprawdzając który temp stół stworzył rozmówca.
Powiązane problemy