Mam procedurę składowaną, która zwraca 80 kolumn i 300 wierszy. Chcę napisać zaznaczenie, które otrzyma 2 z tych kolumn. Coś jak
SELECT col1, col2 FROM EXEC MyStoredProc 'param1', 'param2'
Gdy użyłem powyższej składni, pojawia się błąd:
"Nieprawidłowa nazwa kolumny".
Wiem, że najłatwiejszym rozwiązaniem byłoby zmienić procedurę przechowywaną, ale jej nie napisałem i nie mogę jej zmienić.
Czy jest jakiś sposób na robienie tego, co chcę?
Mógłbym utworzyć tabelę tymczasową, aby umieścić wyniki, ale ponieważ istnieje 80 kolumn, musiałbym stworzyć 80-tabelową tabelę tymczasową, aby uzyskać 2 kolumny. Chciałem uniknąć śledzenia wszystkich zwracanych kolumn.
Próbowałem używać
WITH SprocResults AS ....
zgodnie z sugestią Marka, ale otrzymałem 2 błędyNiepoprawna składnia w pobliżu słowa kluczowego „EXEC”.
Niepoprawna składnia w pobliżu ')'.Próbowałem zadeklarować zmienną tabelową i otrzymałem następujący błąd
Wstaw błąd: nazwa kolumny lub liczba podanych wartości nie zgadza się z definicją tabeli
Jeśli spróbuję
SELECT * FROM EXEC MyStoredProc 'param1', 'param2'
, pojawia się błąd:Niepoprawna składnia w pobliżu słowa kluczowego „exec”.
źródło
EXEC
nie jest słowem kluczowym MySQL (odpowiednikiem MySQL są przygotowane instrukcje ). Chociaż chciałbym poznać odpowiedź na MySQL, poniższe odpowiedzi dotyczą T-SQL. Retagging.Odpowiedzi:
Czy możesz podzielić zapytanie? Wstaw zapisane wyniki proc do zmiennej tabeli lub tabeli tymczasowej. Następnie wybierz 2 kolumny ze zmiennej tabeli.
źródło
Oto link do całkiem dobrego dokumentu wyjaśniającego wszystkie różne sposoby rozwiązania problemu (chociaż wielu z nich nie można użyć, ponieważ nie można zmodyfikować istniejącej procedury składowanej).
Jak udostępniać dane między przechowywanymi procedurami
Odpowiedź Gulzara zadziała (jest udokumentowana w powyższym linku), ale będzie trudna do napisania (musisz podać wszystkie 80 nazw kolumn w instrukcji @tablevar (col1, ...). A w przyszłości jeśli kolumna zostanie dodana do schematu lub dane wyjściowe zostaną zmienione, konieczne będzie zaktualizowanie kodu lub wystąpi błąd.
źródło
Źródło:
http://stevesmithblog.com/blog/select-from-a-stored-procedure/
źródło
To działa dla mnie: (tzn. Potrzebuję tylko 2 kolumn z 30+ zwróconych przez
sp_help_job
)Zanim to zadziała, musiałem uruchomić to:
.... aby zaktualizować
sys.servers
tabelę. (tzn. używanie odnośników w OPENQUERY wydaje się domyślnie wyłączone).Ze względu na moje proste wymaganie nie natknąłem się na żaden z problemów opisanych w sekcji OPENQUERY doskonałego łącza Lance'a.
Rossini, jeśli chcesz dynamicznie ustawić te parametry wejściowe, wówczas użycie OPENQUERY staje się nieco bardziej skomplikowane:
Nie jestem pewien różnic (jeśli w ogóle) między używaniem
sp_serveroption
do bezpośredniej aktualizacji istniejącychsys.servers
odnośników, a używaniemsp_addlinkedserver
(jak opisano w łączu Lance'a) do utworzenia duplikatu / aliasu.Uwaga 1: Wolę OPENQUERY niż OPENROWSET, ponieważ OPENQUERY nie wymaga definicji ciągu połączenia w proc.
Uwaga 2: Powiedziawszy to wszystko: normalnie użyłbym INSERT ... EXEC :) Tak, to dodatkowe 10 minut pisania, ale jeśli mogę pomóc, wolę nie bić się z:
(a) cytatami w cudzysłowie cytaty i
(b) tabele sys i / lub podstępne konfiguracje z połączonym serwerem (np. w tych przypadkach muszę przedstawić swoją sprawę naszym wszechmocnym DBA :)
Jednak w tym przypadku nie mogłem użyć konstruktu INSERT ... EXEC, ponieważ
sp_help_job
już go używa. („Nie można zagnieździć instrukcji INSERT EXEC.”)źródło
Aby to osiągnąć, najpierw musisz utworzyć
#test_table
podobny do poniższego:Teraz wykonaj procedurę i wprowadź wartość
#test_table
:Teraz pobierasz wartość z
#test_table
:źródło
Jeśli możesz zmodyfikować procedurę składowaną, możesz łatwo wprowadzić wymagane definicje kolumn jako parametr i użyć automatycznie utworzonej tabeli tymczasowej:
W takim przypadku nie trzeba ręcznie tworzyć tabeli tymczasowej - jest ona tworzona automatycznie. Mam nadzieję że to pomoże.
źródło
Warto wiedzieć, dlaczego jest to takie trudne. Procedura przechowywana może zwracać tylko tekst (drukować „tekst”), może zwracać wiele tabel lub może nie zwracać żadnych tabel.
Więc coś takiego
SELECT * FROM (exec sp_tables) Table1
nie zadziałaźródło
(Zakładając, że SQL Server)
Jedynym sposobem pracy z wynikami procedury składowanej w T-SQL jest użycie
INSERT INTO ... EXEC
składni. Daje to możliwość wstawienia do tabeli tymczasowej lub zmiennej tabeli, a następnie wybrania potrzebnych danych.źródło
Szybki hack polegałby na dodaniu nowego parametru
'@Column_Name'
i wywołaniu przez funkcję wywołującą nazwy kolumny do pobrania. W części zwrotnej sproc będziesz miał instrukcje if / else i zwróci tylko określoną kolumnę, a jeśli pusty - zwróci wszystko.źródło
Jeśli robisz to w celu ręcznej weryfikacji danych, możesz to zrobić za pomocą LINQPad.
Utwórz połączenie z bazą danych w LinqPad, a następnie utwórz instrukcje C # podobne do następujących:
Odwołanie http://www.global-webnet.net/blogengine/post/2008/09/10/LINQPAD-Using-Stored-Procedures-Accessing-a-DataSet.aspx
źródło
W przypadku SQL Server uważam, że to działa dobrze:
Utwórz tabelę tymczasową (lub tabelę stałą, tak naprawdę nie ma znaczenia) i wstaw wstawkę do instrukcji względem procedury składowanej. Zestaw wyników SP powinien pasować do kolumn w tabeli, w przeciwnym razie wystąpi błąd.
Oto przykład:
Otóż to!
źródło
Jak wspomniano w pytaniu, trudno jest zdefiniować 80-stopniową tabelę temperatur przed wykonaniem procedury składowanej.
Tak więc odwrotnie jest zapełnianie tabeli na podstawie zestawu wyników procedury składowanej.
Jeśli pojawia się jakikolwiek błąd, musisz włączyć zapytania rozproszone ad hoc, wykonując następujące zapytanie.
Aby wykonać
sp_configure
oba parametry w celu zmiany opcji konfiguracji lub uruchomieniaRECONFIGURE
instrukcji, musisz mieć uprawnienia naALTER SETTINGS
poziomie serweraTeraz możesz wybrać określone kolumny z wygenerowanej tabeli
źródło
Spróbuj tego
źródło
Wiem, że wykonanie ze sp i wstawienie do tabeli temp lub zmiennej tabeli byłoby opcją, ale nie sądzę, że to twoje wymaganie. Zgodnie z twoim wymaganiem poniższe zapytanie powinno działać:
jeśli masz zaufane połączenie, użyj poniższej instrukcji zapytania:
jeśli pojawia się błąd, aby uruchomić powyższą instrukcję, wystarczy uruchomić tę instrukcję poniżej:
Mam nadzieję, że pomoże to komuś, kto stanie przed podobnym problemem. Jeśli ktoś chciałby spróbować z tabelą tymczasową lub zmienną tabelową, która powinna wyglądać tak poniżej, ale w tym scenariuszu powinieneś wiedzieć, ile kolumn zwraca Twój sp, to powinieneś utworzyć tyle kolumn w tabeli tymczasowej lub zmiennej tabelowej:
źródło
Dla każdego, kto ma SQL 2012 lub nowszy, byłem w stanie to osiągnąć za pomocą procedur składowanych, które nie są dynamiczne i za każdym razem mają te same kolumny wyjściowe.
Ogólny pomysł polega na tym, że tworzę zapytanie dynamiczne, aby tworzyć, wstawiać, wybierać i upuszczać tabelę tymczasową i wykonać ją po wygenerowaniu. Dynamicznie generuję tabelę temp, najpierw pobierając nazwy i typy kolumn z procedury składowanej .
Uwaga: istnieją znacznie lepsze, bardziej uniwersalne rozwiązania, które będą działać z mniejszą liczbą wierszy kodu, jeśli będziesz chciał / mógł zaktualizować SP lub zmienić konfigurację i używać
OPENROWSET
. Skorzystaj z poniższego opisu, jeśli nie masz innego wyjścia.źródło
Najłatwiejszy sposób, jeśli potrzebujesz tego tylko raz:
Eksportuj do programu Excel w Kreatorze importu i eksportu, a następnie zaimportuj ten program Excel do tabeli.
źródło
Utwórz widok dynamiczny i uzyskaj z niego wynik .......
źródło
Wytnij i wklej oryginalny SP i usuń wszystkie kolumny oprócz 2, których chcesz. Lub. Chciałbym przywrócić zestaw wyników, zmapować go do odpowiedniego obiektu biznesowego, a następnie LINQ wydzielić dwie kolumny.
źródło