Welcome to Sign in | Join | Help
in Search

Extragere anumite coloane din rezultatul intors de SP

Last post 10-26-2013, 2:09 by B_gd_n[ ]Sahlean. 9 replies.
Sort Posts: Previous Next
  •  10-24-2013, 11:35 9596

    Extragere anumite coloane din rezultatul intors de SP

    Salut.

     

    Se pot extrage DOAR anumite rezultate de pe anumite coloane pe care le poate returna o procedura stocata (de ex. sp_who)? (pentru ca ulterior sa le introduc intr-un tabel de exemplu) --> preferabil altfel decat cu OPENROWSET.

     

    Merci.


    G.
  •  10-24-2013, 12:04 9597 in reply to 9596

    Re: Extragere anumite coloane din rezultatul intors de SP

    CREATE TABLE #tmp (<column_list>)
    INSERT INTO #tmp EXEC MyProc
    SELECT <columns> FROM #tmp
  •  10-24-2013, 12:20 9598 in reply to 9596

    Re: Extragere anumite coloane din rezultatul intors de SP


    CREATE TABLE #tmp (spid int,ecid int )
    INSERT INTO #tmp EXEC SP_WHO
    SELECT * FROM #tmp


    nu functioneaza, pentru ca sp_who returneaza mai multe coloane...

    Msg 213, Level 16, State 7, Procedure sp_who, Line 79
    Insert Error: Column name or number of supplied values does not match table definition.

    ori eu NU vreau sa folosesc toate coloanele ci sa folosesc DOAR o parte din ele


    merci.



    G.
  •  10-24-2013, 12:40 9599 in reply to 9598

    Re: Extragere anumite coloane din rezultatul intors de SP

    Creeaza #tmp dupa "chipul si asemanarea" procedurii din care vrei sa iei rezultatul.
    Daca lucrezi cu o versiune de SQL Server din era noastra poti sa folosesti DMVs in loc de sp_who - sys.dm_exec_connections, sys.dm_exec_sessions,
    sys.dm_exec_requests
    .


  •  10-24-2013, 12:47 9600 in reply to 9599

    Re: Extragere anumite coloane din rezultatul intors de SP

    Lucrez cu SQL 2008 R2.

    Daca SP-ul are 200 de coloane , eu nu vreau sa creez #temp-ul tot cu 200 de coloane identice, ci doar cu cele 2 coloane de care am nevoie...
    Motiv pentru care as dori sa extrag din cele 200 de coloane doar 2..
    G.
  •  10-24-2013, 12:55 9601 in reply to 9600

    Re: Extragere anumite coloane din rezultatul intors de SP

    Atunci incearca sa folosesti un query bazat pe DMVs.
  •  10-24-2013, 1:54 9602 in reply to 9601

    Re: Extragere anumite coloane din rezultatul intors de SP

    merci

    alte idei?
    G.
  •  10-24-2013, 2:02 9603 in reply to 9602

    Re: Extragere anumite coloane din rezultatul intors de SP

    C’est vraiment peu de chose :)
  •  10-24-2013, 3:18 9604 in reply to 9603

    Re: Extragere anumite coloane din rezultatul intors de SP

    solved:

    SELECT spid, ecid
    INTO r.dbo.List
    FROM OPENQUERY(ls, 'set fmtonly off exec sp_who')

    Din toate coloanele returnate de o procedura stocata oarecare (ex: sp_who in ex. de fata) am extras doar 2 de care am nevoie (ex:spid, ecid in exemplul de fata ).

    G.
  •  10-26-2013, 2:09 9606 in reply to 9604

    Re: Extragere anumite coloane din rezultatul intors de SP

    O solutie poate fi factorizarea codului SQL care este comun celor doua apeluri ale procedurii stocate dbo.MyProc intr-un modul SQL (functie tabelara inline-de preferat, procedura stocata, view) care sa fie apelat de procedura initiala dbo.MyProc (SEELCT 200 coloane) si de o noua procedura dbo.MyProc2 (SELECT 2 coloane).


    Un exemplu: daca procedura initiala dbo.MyProc este de forma urmatoare


    CREATE PROCEDURE dbo.MyProc
    (
    params
    )
    AS
    BEGIN
    SELECT 200 cols
    FROM tabel1 ... tabel 2 ... tabeln
    WHERE ...
    END;
    GO


    atunci se poate crea o functie tabelara inline (preferabila din motive de performanta) astfel


    CREATE FUNCTIOn dbo.MyFuncBase
    (
    params
    )
    RETURNS TABLE
    AS
    RETURN
    SELECT 200 cols
    FROM tabel1 ... tabel 2 ... tabeln;
    GO


    functie care sa fie apelata de procedura stocata initiala


    CREATE PROCEDURE dbo.MyProc
    (
    params
    )
    AS
    BEGIN
    SELECT 200 cols
    FROM dbo.MyFunctBase(params) AS f
    WHERE something ...
    END;
    GO


    si de o noua procedura stocata care va intoarce doar valorile din cele doua coloane care prezinta interes:


    CREATE PROCEDURE dbo.MyProc2
    (
    params
    )
    AS
    BEGIN
    SELECT 2 cols
    FROM dbo.MyFunctBase(params) AS f
    WHERE something else ...
    END;
    GO


    Daca este posibil un asemenea scenariu avantajul (teoretic - trebuiesc realizate teste) este performanta: in cazul apelului EXEC dbo.MyProc2 (care presupune SELECT 2 col2 FROM ) server-ul va avea posibilitatea sa elimine jonctiunile si tabelele/indecsii care nu sunt necesare/i.

    Binenteles, ca in doilea caz ai putea sa apelezi direct functia fara sa mai fie necesar
    apelul procedurilor stocate.
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems