[MSSQL] dynamiczne tworzenie zapytania i data
Krzysztof Wiśniewski - 13-07-2006 01:46
[MSSQL] dynamiczne tworzenie zapytania i data
Jest sobie procedura z parametrem - datą:
CREATE PROCEDURE dbo.MojaProcedura ( @JakaData smalldatetime ) AS BEGIN SET NOCOUNT ON; DECLARE @strSQL varchar (8000); SET @strSQL = ' SELECT costam FROM dbo.Tabela NNER JOIN dbo.InnaTabela ON dbo.InnaTabela.ID = dbo.Tabela.ID AND dbo.Tabela.Pole >= DATEDIFF(d, '+ CONVERT(varchar(10), @JakaData, 120) +', dbo.InnaTabela.InnePole) WHERE ... '; exec @strSQL; END
W jaki sposób w stringu @strSQL uzyskać datę @JakaData w apostrofach?
Uruchomienie procedury w postaci jw generuje poprawny kod w stringu @strSQL, ale - niestety! - data nie jest "ubrana" w apostrofy, więc rezultat exec @strSQL jest żałosny.
Z kolei jeżeli użyję cudysłowia:
.... dbo.Tabela.Pole >= DATEDIFF(d, "'+ CONVERT(varchar(10), @JakaData, 120) +'",
to dostaję niepoprawny kod instrukcji, którego wywołanie kończy się błędem.
Jak sobie z tym poradzić?
Uprzedzając - procedura ma więcej parametrów i to, co znajdzie się po 'WHERE' jest zależne właśnie od nich, zatem stosowanie takiej "sklejki" i wykonywanie na końcu exec jest konieczne.
-- Pozdrawiam, Krzysiek
Jacek Stawicki - 13-07-2006 01:46
Użytkownik "Krzysztof Wiśniewski" <ktuvok@poczta.onet.pl> napisał w wiadomości news:e93ntm$mnb$1@news.onet.pl...
> W jaki sposób w stringu @strSQL uzyskać datę @JakaData w apostrofach?
declare @ciag_z_apostrofem varchar(10)
set @ciag_z_apostrofem = ' '' '
czyli apostrof w ciagu znakowym wymaga jego podwojenia.
Dawid Kloch - 14-07-2006 02:45
Krzysztof Wiśniewski wrote: > Jest sobie procedura z parametrem - datą: > > > W jaki sposób w stringu @strSQL uzyskać datę @JakaData w apostrofach? > > Uruchomienie procedury w postaci jw generuje poprawny kod w stringu @strSQL, > ale - niestety! - data nie jest "ubrana" w apostrofy, więc rezultat exec > @strSQL jest żałosny. > > Z kolei jeżeli użyję cudysłowia: > > ... dbo.Tabela.Pole >= DATEDIFF(d, "'+ CONVERT(varchar(10), @JakaData, 120) > +'", > > to dostaję niepoprawny kod instrukcji, którego wywołanie kończy się błędem. > > Jak sobie z tym poradzić? > > Uprzedzając - procedura ma więcej parametrów i to, co znajdzie się po > 'WHERE' jest zależne właśnie od nich, zatem stosowanie takiej "sklejki" i > wykonywanie na końcu exec jest konieczne. >
Aby zawrzeć apostrof nalezy go poprzedzić znakiem ucieczki którym w tym wypadku jest apostrof, czyli: ' ''TEKST'' '.
Ale aby tego uniknąć i jednoczęśnie mieć bardziej stabilny kod (i łatwiejszy w debugowaniu to polecam prodedurę sp_executesql. Poniżej prosty przykład, który nadawał by się do przystosowania do przykładu:
BEGIN
DECLARE @v_date DATETIME DECLARE @v_sql NVARCHAR(500)
SET @v_date = '2006-05-01 11:20:11' SET @v_sql = ' SELECT @v_date_in_sql '
EXEC sp_executesql @v_sql, N'@v_date_in_sql DATETIME', @v_date_in_sql = @v_date
END
pozdrawiam Dawid
Gsue - 14-07-2006 02:46
Użytkownik "Dawid Kloch" <dawid@WYTNIJ_TOformix.pl> napisał w wiadomości news:e94t05$cu7$3@atlantis.news.tpi.pl... > Krzysztof Wiśniewski wrote:
<ciach> > Aby zawrzeć apostrof nalezy go poprzedzić znakiem ucieczki którym w tym > wypadku jest apostrof, czyli: ' ''TEKST'' '. > > Ale aby tego uniknąć i jednoczęśnie mieć bardziej stabilny kod (i > łatwiejszy w debugowaniu to polecam prodedurę sp_executesql. > Poniżej prosty przykład, który nadawał by się do przystosowania do > przykładu: > > BEGIN > > DECLARE @v_date DATETIME > DECLARE @v_sql NVARCHAR(500) > > SET @v_date = '2006-05-01 11:20:11' > SET @v_sql = ' SELECT @v_date_in_sql ' > > EXEC sp_executesql @v_sql, N'@v_date_in_sql DATETIME', @v_date_in_sql = > @v_date > > END > > pozdrawiam > Dawid
Witaj, najlepiej dołączając instrukcję WITH RECOMPILE :( Ostatnio zauważyłem tendencję do składania zapytań. Obawiam się, że ma to solidny wpływ szybkość. Już ktoś powyżej radził przekazywanie dynamicznego sql'a zamiast procedur składowanych. Rozumiem, że zawsze można postawić szybszą maszynę, ale... niestety ma to pewne ograniczenia- większe zbiory jednak są przetwarzane dosy ć wolno a namówienie klienta na przejście z 4 na 8 procesorów nie zawsze jest proste. Oczywiście problem nie istnieje przy "małych" zbiorach, ale...
Pozdrawiam Gsue
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
[sql][pgsql] zapytanie sql
zanotowane.pldoc.pisz.plpdf.pisz.platanvarne633.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 |
|