ďťż
 
[MSSQL] dynamiczne tworzenie zapytania i data ďťż
 
[MSSQL] dynamiczne tworzenie zapytania i data
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

[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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • atanvarne633.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com