Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MS SQL wysylanie maila i zmienna @sql

Moze ktos bedzie mogl pomoc, mnie sie juz skonczyly koncepcje :)

Probuje zaprzac database mail do wysylania raportow. Jeden z moich raportow to dynamiczny pivot, czyli zapytanie budowane z kilku elementow, ktore sa trzymane w zmiennej @sql. Niestety, z jakiegos powodu parser nie lyka zapytan przekazywanych w zmiennych.

Przykladowo, dla @body maila kontruowanego w taki sposob:

DECLARE @tableHTML NVARCHAR(MAX) ;
SET @tableHTML =
N'<H1>Work Order Report</H1>' +
N'<table border="1">' +
N'<tr>' + 'header' + N'</tr>' +
---zapytanie do lykniecia---
CAST ( ( SELECT td = a, '',
td = b, ''
FROM table
FOR XML PATH('tr'), TYPE
) AS NVARCHAR(MAX) ) +
-----koniec zapytania---
N'</table>' ;

wszystko jest ok i wykonanie "print @tableHTML" zwraca:
<tr>header</tr><tr><td>dane1</td><td>dane2</td>..

Kiedy jednak zrobie

@sql = 'CAST ( ( SELECT td = a, '''',
td = b, ''''
FROM table
FOR XML PATH(''tr''), TYPE
) AS NVARCHAR(MAX) )'

a potem

DECLARE @tableHTML NVARCHAR(MAX) ;
SET @tableHTML =
N'<H1>Work Order Report</H1>' +
N'<table border="1">' +
N'<tr>' + 'header' + N'</tr>' +
---zapytanie do lykniecia---
@sql +
-----koniec zapytania---
N'</table>' ;

dostaje wynik w ktorym zamiast tagow html wstawiony jest po prostu tekst zapytania, czyli:
<tr>header</tr>CAST ( ( SELECT td =... itd

Jak zmusic parser do lykniecia zmiennej jako zapytania, nie jako tekstu? Jestem pewien, ze jest na to jakas prosta metoda, tylko jej nie widze :) Bede wdzieczny a pomoc.Bartosz Ślepowroński edytował(a) ten post dnia 23.07.08 o godzinie 17:52
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MS SQL wysylanie maila i zmienna @sql

W kwesti mozliwych rozwiazan ktore odrzucam:

1) wrzucic wynik @sql do #tabeli i potem zrobic na niej selecta. Musialbym zbudowac kolejnego dynamicznego SQL ktory by ta tabele tworzyl, bez przesady :)
2) cos w stylu:

exec sp_executesql @sql, N'@Value nvarchar(4000) output', @value = @myvalue output

potrzebuje miec wynik selecta w ciagu, a do output moge zdaje sie tylko poszczegolne kolumny zrzucac.

konto usunięte

Temat: MS SQL wysylanie maila i zmienna @sql

pisane na kolanie bez parsowania ;)

DECLARE @tableHTML VARCHAR(MAX)
,@znacznik varchar(max)
SET @tableHTML =
'<H1>Work Order Report</H1><table border="1"><tr>header</tr>##znacznik##</table>'

set @znacznik = 'casty selecty i inne pierdoły'

set @tableHTML = replace(@tableHTML,##znacznik##,@znacznik)

tak z grobsza... ;)
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MS SQL wysylanie maila i zmienna @sql

Hm, tego jeszcze nie próbowałem..

Z lektury linkow googlowych wynika, że albo problem jest tak prosty, że nikt o nim nie pisze albo z logiki t-sql wynika, ze sie tego nie zrobic, wiec nikt sie nie pyta :)
Wojciech Nowak

Wojciech Nowak Konsultant Systemów
Bankowych | Analityk
Systemowy

Temat: MS SQL wysylanie maila i zmienna @sql

@sql = 'CAST ( ( SELECT td = a, '''',
td = b, ''''
FROM table
FOR XML PATH(''tr''), TYPE
) AS NVARCHAR(MAX) )'

tak jak wyżej zadeklarowana zmienna zawsze zwróci Ci string.

najszybciej możesz spróbować: SELECT (CAST...itp.) INTO @sql FROM table.

tylko z klauzulą FOR XML w tym przypadku może być kłopot, nie sprawdzałem tego.

pzdr
Wojciech Nowak

Wojciech Nowak Konsultant Systemów
Bankowych | Analityk
Systemowy

Temat: MS SQL wysylanie maila i zmienna @sql

aha, oczywiście to rozwiązanie jest modelowe, gdy SELECT zwraca jedną wartość. Dla większej ilości CURSOR oraz pętla FOR EACH. Powinno działać.
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MS SQL wysylanie maila i zmienna @sql

Rozwiazanie Roberta niestety nie dziala (ten sam efekt), a rozwiazanie Wojciecha sie niestety nie nadaje - juz mam swojege zapytanie w zmiennej @sql, nie moge zrobic'select(@sql) into @sql' (chyba w ogole nie da sie select into @variable, ktora nie jest tabela?).

Moze bardziej lopatologicznie. Ponizej dwa krotkie skrypty

--- TO ZAPYTANIE ZWRACA DOBRY WYNIK
DECLARE @tableHTML nvarchar(max);
SET @tableHTML =
'<H1>Report</H1><table border="1"><tr> Row 1</tr>' +
cast((SELECT getdate()) as nvarchar(max)) +
'</table>' ;

print @tableHTML
<H1>Report</H1><table border="1"><tr> Row 1</tr>Jul 24 2008 10:42AM</table>

---TO ZWRACA ZLY:
declare @sql nvarchar(4000)
set @sql = 'cast((SELECT getdate()) as nvarchar(max))'

DECLARE @tableHTML nvarchar(max);
SET @tableHTML =
'<H1>Report</H1><table border="1"><tr> Row 1</tr>' +
@sql +
'</table>' ;

print @tableHTML

<H1>Report</H1><table border="1"><tr> Row 1</tr>cast((SELECT getdate()) as nvarchar(max))</table>

Problem polega na tym, ze @sql to zapytanie zlozone za pomoca skryptu, z rozna iloscia kolumn w zaloznosci od zadanych parametrow. Gdybym zapytanie nie bylo dynamicznie generowane nie byloby problemu, ale zapytanie ze mniennej wrzucone do stringa wyrzuca nie wynik zapytania a samo zapytanie.

Naprawde nikt nie wie jak sobie z tym poradzic? Wychodzi na to ze pozostaje mi rozwiazanie z dodatkowa #tabela.

[EDIT] ktore tez nie dziala, bo zarowno #tabela jak i @tabela musza byc tworzone dynamicznie i odpalane przez exec(), wiec nie sa dostepne w funkcji (sa tworzone tylko na czas wykonania exec). Fak. Przeciez nie bede tworzyl za kazdym razem permanentnej tabeli.Bartosz Ślepowroński edytował(a) ten post dnia 24.07.08 o godzinie 12:58
Wojciech Nowak

Wojciech Nowak Konsultant Systemów
Bankowych | Analityk
Systemowy

Temat: MS SQL wysylanie maila i zmienna @sql

zadeklaruj zmienną w ten sposób:

set @sql = select cast( getdate() as nvarchar(max) )

powyższe jest odpowiednikiem oraclowego:
select sysdate into zmienna from dual

jak weźmiesz prawą stronę w apostrofy zawsze otrzymasz string. jak wyrzucisz apostrof a przed instrukcją dodasz SELECT powinno działać.

wnWojciech Nowak edytował(a) ten post dnia 24.07.08 o godzinie 14:16
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MS SQL wysylanie maila i zmienna @sql

A da sie dynamicznie wygenerowac zapytanie bez apostrofow? Chyba nie.
Wojciech Nowak

Wojciech Nowak Konsultant Systemów
Bankowych | Analityk
Systemowy

Temat: MS SQL wysylanie maila i zmienna @sql

dynamicznie ze stringa to chyba tylko przez EXEC:

przykład:

set @sql = 'select * from tabela'
exec @sql
Bartosz Ślepowroński:
A da sie dynamicznie wygenerowac zapytanie bez apostrofow? Chyba nie.
Bartosz Ślepowronski

Bartosz Ślepowronski Problem? Jaki
problem?

Temat: MS SQL wysylanie maila i zmienna @sql

create tabela (o zmiennej ilosci kolumn)
exec(@sql) <- ktory wstawia wynik do tabeli

@tableHTML = select z tabeli (do xml, convert na ncarchar(max))

Wynikiem jest prawie gotowy string html, trzeba tylko zamienic nazwy kolumn na znaczniki html, na szczescie prosty loop "WHILE... replace.."zalatwia sprawe.

Ale to NIE JEST eleganckie rozwiazanie :)Bartosz Ślepowroński edytował(a) ten post dnia 24.07.08 o godzinie 16:29



Wyślij zaproszenie do