[MS SQL 2000/2005] Procedura z dynamicznym SQL
Kedzier - 17-05-2006 00:41
[MS SQL 2000/2005] Procedura z dynamicznym SQL
Witam,
Jak przekazac do procedury zapytanie dynamicznie w postaci string'a, musze zbudowac dynamicznie sql i musze przekazac do procedury dynamicznie zbudowanego whera jako stringa. Czy da sie cos takiego zrobic?
pozdr, P.
Grzesiek G. - 17-05-2006 00:41
Kedzier napisał(a): > Witam, > > Jak przekazac do procedury zapytanie dynamicznie w postaci string'a, > musze zbudowac dynamicznie sql i musze przekazac do procedury > dynamicznie zbudowanego whera jako stringa. > Czy da sie cos takiego zrobic?
Tak - sp_executesql. Chociaż lepiej byłoby tego whera budować w samej procedurze i wykorzystać możliwość podania parametrów do sp_executesql.
-- Grzegorz Gruza Odpowiadając usuń "spamerom_nie." z adresu!!!
Kedzier - 17-05-2006 00:41
Grzesiek G. napisał(a): > Tak - sp_executesql. Chociaż lepiej byłoby tego whera budować w samej > procedurze i wykorzystać możliwość podania parametrów do sp_executesql.
Moze troche inaczej
mam taka procedure
ALTER PROCEDURE [dbo].[PK_ANALISE_COUNT_AND_PRECENT] -- Parametry wejsciowe Id definicji i id pytania @DefinitionID int, @QuestionID int
AS BEGIN SET NOCOUNT ON;
declare @IlAnkiet int; select @IlAnkiet = count(*) from srv_survey h inner join srv_survey_object o on (h.object_id=o.object_id) where h.definition_id=@DefinitionID SELECT @QuestionID QUESTION_ID, @DefinitionID DEFINITION_ID, ISNULL(a.VALUE, '') AS nr, COUNT(*) AS il_wystapien, CONVERT(numeric(10, 2), CONVERT(numeric(10, 2), COUNT(*)) / CONVERT(numeric(10, 2), @IlAnkiet)) * 100 AS Procent FROM SRV_SURVEY AS h INNER JOIN SRV_SURVEY_OBJECT AS o ON h.OBJECT_ID = o.OBJECT_ID LEFT OUTER JOIN SRV_ANSWER AS a ON a.QUESTION_ID = @QuestionID AND a.SURVEY_ID = h.SURVEY_ID WHERE (h.DEFINITION_ID = @DefinitionID) GROUP BY a.VALUE END
i teraz jak do tego dobudowac jeszcze where'a dalej ktory moze miec kilkanascie parametrow zupelnie dynamicznie!
wrzucic to zaputanie w sp_executesql ?
Grzesiek G. - 18-05-2006 00:16
Kedzier napisał(a): > Grzesiek G. napisał(a): > >> Tak - sp_executesql. Chociaż lepiej byłoby tego whera budować w samej >> procedurze i wykorzystać możliwość podania parametrów do sp_executesql. >
PRzesadziłem zbudowaniem whera w procedurze
> > Moze troche inaczej > > mam taka procedure > [...] > > > i teraz jak do tego dobudowac jeszcze where'a dalej ktory moze miec > kilkanascie parametrow zupelnie dynamicznie! > > > wrzucic to zaputanie w sp_executesql ?
Może prostszy przykład do adaptacji:
DECLARE @stmt AS NVARCHAR(4000) DECLARE @conditions AS NVARCHAR(4000)
SET @stmt = N'SELECT col1, col2 FROM tabela WHERE 1 = 1' SET @conditions = ''
IF costam BEGIN SET @coditions = @conditions + 'AND jakis warunek' END
....
SET @stmt = @stmt + @conditions
EXEC sp_executesql @stmt
Pozdrawiam
-- Grzegorz Gruza Odpowiadając usuń "spamerom_nie." z adresu!!!
Kedzier - 18-05-2006 00:16
Grzesiek G. napisał(a): > Może prostszy przykład do adaptacji hehe -> dzieki, w koncu udalo mi sie uruchomic msdn i sam znalazlem dokumentacje tej procedury :) dzieki za checi,
a jak jest z wydajnoscia takiej procedurki?
pozdr, P.
Grzesiek G. - 18-05-2006 00:16
Kedzier napisał(a): > Grzesiek G. napisał(a): > >> Może prostszy przykład do adaptacji > > hehe -> dzieki, w koncu udalo mi sie uruchomic msdn i sam znalazlem > dokumentacje tej procedury :) > dzieki za checi, > > a jak jest z wydajnoscia takiej procedurki?
Plany wykonania procedur z sp_executesql są keszowane, tu można zyskać w stosunku do EXEC(zapytanie).
Ale przy rozmowach o wydajności nie można generalizować.
Pozdrawiam
-- Grzegorz Gruza Odpowiadając usuń "spamerom_nie." z adresu!!!
Kedzier - 18-05-2006 00:16
Grzesiek G. napisał(a): > Ale przy rozmowach o wydajności nie można generalizować.
u mnie o tyle to jest wazne ze jesli ja tych zapytan bede mial powiedzmy do danego zapytania ok 1000 na godzine to cachowanie tego moze przyspieszyc dzialanie. niestety zmuszony bylem robic taka procedure generyczna.
pozdr, i dzieki Piotrek
Grzesiek G. - 18-05-2006 00:16
Kedzier napisał(a): > Grzesiek G. napisał(a): > >> Ale przy rozmowach o wydajności nie można generalizować. > > > u mnie o tyle to jest wazne ze jesli ja tych zapytan bede mial powiedzmy > do danego zapytania ok 1000 na godzine to cachowanie tego moze > przyspieszyc dzialanie. > niestety zmuszony bylem robic taka procedure generyczna.
Jeszcze lepiej jest robić zapytania na kliencie i używać parametrów dla sp_executesql. Wtedy będą keszowane plany zapytań dla różnych zestawów parametrów.
Pozdrawiam
-- Grzegorz Gruza Odpowiadając usuń "spamerom_nie." z adresu!!!
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Centralny serwer =?ISO-8859-2?Q?log=F3w_MS_Windows_na_Po?==?ISO-8859-2?Q?stgreSQL?=
[OT] Praca - wymagania PS, CD, AI, AE, QE, MS, CD, AVI, SWF...
[oracle] czy da =?ISO-8859-2?Q?si=EA_z_poziomu_procedury_?==?ISO-8859-2?Q?zrobi=E6_kopi=EA_zapasow=B1=3F?=
=?iso-8859-2?Q?[MS=20SQL=202000]=20Warto=B6=E6=20domy=B6lna=20w=20polu=20datetime? =
=?iso-8859-2?Q?=5BMySQL=5D_i_MS_Acccess_insert_do_dw=F3ch_tab el?=
Współużytkowanie jednej bazy poprzez 2 komputery (uzupełnianie) jak ? (Baza w MS acces97 na 1 komp.)
=?iso-8859-2?Q?VB_6.0=2C_.NET=2C_2005=2C_czym_to_si=EA_r=F3=B Fni=3F?=
=?iso-8859-2?Q?jak_zamieni=E6_dane_w_bazie_MS_access?=
MS Excel - =?ISO-8859-2?Q?wilodost=EApowo=B6=E6?=
=?iso-8859-2?Q?=5BSQL_Server_2000=5D_uprawnienienia_do_u=BFyw ania_widoku_?==?iso-8859-2?Q?opartego_na_tabeli_z_innej_bazy?=
zanotowane.pldoc.pisz.plpdf.pisz.plautwywalczyl.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|