Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SQL Server - WAIT in UDF

8 views
Skip to first unread message

Christian Winther

unread,
Jul 9, 2012, 5:38:07 AM7/9/12
to
Hallo,

hätte da ein kleines Problem:

Umgebung:

Windows Server 2008/MSSQL 2008:

Problem:

Eine UDF (user-defined function) liefert an eine Applikation ein Tabelle
mit Gut/Schlecht-Werten zurück. Lief bisher problemlos, da Test und
Nutzung der Testwerte aus DB zeitlich getrennt.
In der neuen Anlage -zeitlich alles unmittelbar nacheinander - kommt es
zu Laufzeitproblemen. Die Infos, welche zu der Gut-/Schlecht-Bewertung
führen, sind noch gar nicht in der DB, da werden sie schon abgefragt.

Möglichkeiten:

1. Applikation so umstricken, dass sie bei nicht vorhandenen Werten
selber Waits einbaut und dann wieder pollt ==> Externes Programm, liegt
nicht in meiner Hand

2. In besagte UDF WAITs einbauen.

2. Habe ich versucht. Bin aber bisher gescheitert:

2.1. DECLARE @DelayTime VARCHAR(10) = '00:00:10'
WAITFOR DELAY @DelayTime

==> WAITFOR DELAY darf nicht in UDFs verwendet werden


2.2 Stored Procedure (sp_Delay01), welche diese Funktonalität übernimmt
führt zu Fehler:
Msg 557: Only functions and some stored procedures can be executed from
within a function

2.3. EXEC master.sys.xp_cmdshell 'timeout /T 10 > nul'

führt zu Fehler: Input redirection ist not supported


Frage: Wie baut man ein sinnvolles WAIT ein, ohne die DB mit sinnlosen
SELECTs etc. zu belasten.

MfG CW

Peter Lange

unread,
Jul 12, 2012, 12:14:12 PM7/12/12
to
Am 09.07.2012 11:38, schrieb Christian Winther:
> Hallo,

Auch Hallo,

> Windows Server 2008/MSSQL 2008:
>
> Problem:
>
> Eine UDF (user-defined function) liefert an eine Applikation ein Tabelle
> mit Gut/Schlecht-Werten zurück. Lief bisher problemlos, da Test und
> Nutzung der Testwerte aus DB zeitlich getrennt.
> In der neuen Anlage -zeitlich alles unmittelbar nacheinander - kommt es
> zu Laufzeitproblemen. Die Infos, welche zu der Gut-/Schlecht-Bewertung
> führen, sind noch gar nicht in der DB, da werden sie schon abgefragt.

Normaler Weg wäre: Ermitteln, ob die Werte da sind, dann entscheiden ob
Ausführung oder nicht.

> Möglichkeiten:
>
> 1. Applikation so umstricken, dass sie bei nicht vorhandenen Werten
> selber Waits einbaut und dann wieder pollt ==> Externes Programm, liegt
> nicht in meiner Hand

Das ist schlecht, wenn die ext. Anwendung pollt. Wenn sie nur gestartet
wird - siehe oben.

Peter

Christian Winther

unread,
Jul 12, 2012, 3:23:01 PM7/12/12
to
Am 12.07.2012 18:14, schrieb Peter Lange:
[...]
>> 1. Applikation so umstricken, dass sie bei nicht vorhandenen Werten
>> selber Waits einbaut und dann wieder pollt ==> Externes Programm, liegt
>> nicht in meiner Hand
>
> Das ist schlecht, wenn die ext. Anwendung pollt. Wenn sie nur gestartet
> wird - siehe oben.
>
> Peter
>
Hallo Peter,

danke für Deine Antwort.

Habe inzwischen noch etwas herumexperimentiert.
Ergebnis:
Mit UDF nicht lösbar. Selbst wenn man WAITs in irgendeiner Weise
hinbekommt, die UDF - einmal gestartet - läuft in einer eigenen
Transaktion und "sieht" damit neu hinzugefügte Werte nicht.

Habe das Ganze in einer SP realisert. Damit hat man wesentlich mehr
Möglichkeiten. Es stellte sich eh heraus, dass die Anforderungen
wesentlich komplexer sind (Gut-/Schlecht-Werte aus mehreren Quelle in
zeitlich zu beachtender Abfolge vereinigen; MUSS-Quellen, etc.),

Damit muss das externe Programm auf jeden Fall angepaßt werden.
Das dort das Polling (<Wartezeit>*<maxAnzahlWiederholungen>;
parametrisiert) gemacht wird, finde ich richtig. Wenn ich das in der SP
mache, läuft die Applikation u.U. in einen Connection-Timeout. Bisher
musste der Bediener nach der ersten Abfrage, die keine Daten lieferte,
händisch eingreifen.

MfG CW



0 new messages