Wywołanie jednej procedury składowanej z wynikami z drugiej jako parametr

0

Witam,

Mam ciekawą kwestię do rozwiązania. Mianowicie, mam dwie procedury składowane. W pierwszej podaje parameter, który znam, I zwraca ona ZAWSZE tylko jeden rekord a w drugiej musze podać jako parameter jedną wartość ze zwróconego rekordu pierwszej procedury. Interesuje mnie napisanie skryptu, który będę w stanie zaimportować do projekty w C#. Kombinuje coś w ten sposób:

USE nazwaBazy

DECLARE	@sp1 int,
@sp2 int,
@wart int

EXEC	@sp1 = [dbo].[spAPI1]
		@numer = N'znana_wartość'

@wart = SELECT wartoscZProc_spAPI1 FROM dbo.spAPI1 --w tym miejscu musze jakoś pobrać wartość z jednej komórki rekordu, który jest zwracany przez procedure spAPI1

EXEC	@sp2 = [dbo].[spAPI2]
		@numer = @wart

SELECT	'Return Value' = @sp2

GO

Da się w ogóle coś takiego zrobić? Czy też musze SELECTem pobrać wartość, która mnie interesuje i nie kombinować z procedurami?

1

Nie lepiej byłoby Ci z poziomu aplikacji w C# najpierw wywołać jedną procedurę i pobrać wynik, a następnie ten wynik wpisać jako parametr drugiej ? Przy wykorzystaniu ADO.NET.

0

Hmm... o tym nie pomyślałem... spróbuje tak własnie zrobić :)

0

A tak nie działa?

@wart = select NazwaKolumny from (select wartoscZProc_spAPI1 from dbo.spAPI1)
1
mariano901229 napisał(a):

Nie lepiej byłoby Ci z poziomu aplikacji w C# najpierw wywołać jedną procedurę i pobrać wynik, a następnie ten wynik wpisać jako parametr drugiej ? Przy wykorzystaniu ADO.NET.

To nie jest lepsze rozwiązanie, bo ilość zapytań powinno się minimalizować ;) Jeśli tylko da się coś oblecieć jednym zapytaniem, to szkoda wywoływać ich więcej.

Twoje rowiązanie:

  1. Zapytanie
  2. Czekanie na odpowiedź serwera.
  3. Przetwarzanie odpowiedzi serwera
  4. Zapytanie
  5. Czekanie na odpowiedź serwera
  6. Przetwarzanie odpowiedzi serwera.

Przy jednym zapytaniu robiącym wszystko to naprawdę dużo skraca w komunikacji z bazą danych i zostają punkty od 1 do 3.

0
Spine napisał(a):
mariano901229 napisał(a):

Nie lepiej byłoby Ci z poziomu aplikacji w C# najpierw wywołać jedną procedurę i pobrać wynik, a następnie ten wynik wpisać jako parametr drugiej ? Przy wykorzystaniu ADO.NET.

To nie jest lepsze rozwiązanie, bo ilość zapytań powinno się minimalizować ;) Jeśli tylko da się coś oblecieć jednym zapytaniem, to szkoda wywoływać ich więcej.

Twoje rowiązanie:

  1. Zapytanie
  2. Czekanie na odpowiedź serwera.
  3. Przetwarzanie odpowiedzi serwera
  4. Zapytanie
  5. Czekanie na odpowiedź serwera
  6. Przetwarzanie odpowiedzi serwera.

Przy jednym zapytaniu robiącym wszystko to naprawdę dużo skraca w komunikacji z bazą danych i zostają punkty od 1 do 3.

Zgadzam się.

Kombinuje teraz coś takiego, ale dalej to nie działa:

USE [nazwa_bazy]

DECLARE	@sp1 int,
		@sp2 int,
		@x int

--EXEC	@sp1 = [dbo].[spAPI1]
--		@numer1 = N'wartZeStrumienia' --przy SELECTie poniżej to wywołanie chyba nie potrzebne

SELECT Numer2 AS @x FROM (SELECT * FROM [dbo].[spAPI1] N'wartZeStrumienia') --z tego co pamiętam przy każdorazowym wywołaniu procedury trzeba podać jej parametry

EXEC	@sp2 = [dbo].[spAPI2]
		@numer2 = @x

SELECT	'Return Value' = @sp2

W linijce z SELECTem mam cały czas błąd że kolumny Numer2 nie znaleziono, mimo że na bank ona jest w wynikach wywołania procedury i mam jeszcze mase błędów typu Incorrect syntax near...

Jakieś inne pomysły?

0

Nie da się tak wywolać procedury jak piszesz w sensie from:

SELECT Numer2 AS @x FROM (SELECT * FROM [dbo].[spAPI1] N'wartZeStrumienia') 

Mozesz to zrobić na dwa sposoby:

#1:

SELECT @x = Numer2 FROM OPENQUERY(nazwatwojegoserwera,'exec [nazwabazydanych].[dbo].[spAPI1] N''wartZeStrumienia''')

#2 Stworzenie tempowej tabeli z wynikami i pobranie do niej danych

CREATE TABLE #Result
(
  Numer2 int,  (pozostałekolumy zwracene przez sp)
)
INSERT INTO #Result [dbo].[spAPI1] N'wartZeStrumienia'
SELECT @x = Numer2 FROM#Result
DROP TABLE #Result
0
INSERT INTO #Result [dbo].[spAPI1] N'wartZeStrumienia'

Czy ten INERT na pewno jest poprawny? Wyrzuca mi błąd, który mówi o tym że nie może znaleźć procedury. Po wpisaniu dbo w podpowiedziach pojawiają mi się jedynie nazwy tabeli i funkcji. Procedur tam nie ma. Może coś jest tutaj nie tak jak powinno? Co o tym myślicie?

Po zastosowaniu tymczasowej tabeli w swoim kodzie mam błąd z tym INSERTem właśnie:

Msg 102, Level 15, State 1, Line 19
Incorrect syntax near 'dbo'.

0

zgubiłem exec'a

INSERT INTO #Result exec [dbo].[spAPI1] N'wartZeStrumienia'
0

Rozumiem, ze to nie Toje procedury i nie możesz ich delikatnie zmodyfikować? Bo jeśli byś mógł to lepie aby zamiast tego selecta zrobić return @zmienna tą co potrzebujesz. ale skoro to nie Twoje procedury to nie było tematu :)

1

@leonkuczma - dokładnie tak, nie są to moje procedury, więc jedyne co moge z nimi zrobić to je podejrzeć.

@Panczo - tak myślałem, i znalazłem błąd (nieobecność EXEC'a), teraz już wszystko działa :)

Gdyby ktoś się zastanawiał jak to wszystko ogarnąć jednym zapytaniem:

USE [databaseName]

DECLARE	@return_value int,
		@x int

CREATE TABLE #Temp
(
	Number1 INT,
	Number2 INT,
	Number3 INT
)

INSERT INTO #Temp EXEC [dbo].[spAPI1] N'valueFromStream'

SELECT @x = Number2 FROM #Temp

DROP TABLE #Temp

EXEC	@return_value = [dbo].[spAPI2]
		@Number = @x

SELECT	'Return Value' = @return_value
0

zapiszę sobie, przyda się pewnie kiedyś :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1