![]() |
MS-SQL Procedure & Resultset???
So follgendes Problem:
Ich habe eine Procedure, welche ein paar Berechnungen durchführt und mir dann eine von 2 Temp Tabellen zurückgiebt... Diese wurden errechnet und werden nach dem select gleich wieder gelöscht... Entweder "select * from Temp_Output" oder "select * from Temp_Error" falls ein Fehler auftratt... So in meinem Programm arbeite ich eigendlich bis jetzt nu mit der ADOConnection, nem ADODataset und einer ADOCommand Komponente, da ich bis jetzt nur Recordsets auswerten mußte... damit ich aber die Tabelle von der Procedure anschaun kann, bräuchte ich aber noch eine DataSource und eine ADOQuery bzw. ADOTable... Kann ich irgendwie die Procedure so umschreiben, dass ich meine Ergebnisstabelle als Recordsets zurückbekomm? Dann bräucht ich auch nichts mehr ändern in meinem Programm... ich hoff es hat wer Rat :) Bye |
Re: MS-SQL Procedure & Resultset???
mach einfach als letztes statement ein Select auf deine tmp-tabelle und Du erhältst ein Recordset zurück...
Gruß |
Re: MS-SQL Procedure & Resultset???
In MSSQL kannst du deine SP nach folgender Syntax aufbauen:
SQL-Code:
In Delphi rufst du die SP mittels ExecSQL auf.
create procedure Text
as Select * from Temp GO Gruß |
Re: MS-SQL Procedure & Resultset???
Zitat:
das sieht ATM so aus (bzw. so ähnlich :) )
Code:
Das in Klammern sieht ein bisle anders aus...
...
If @ERROR = 1 Begin Select * From [Temp_ERROR] End Else Begin Select * From [Temp_Output] End DROP TABLE [Temp_ERROR] DROP TABLE [Temp_Output] |
Re: MS-SQL Procedure & Resultset???
Also nur noch so am Rande, solltest du im Grund wirklich temporäre Tabellen in deiner SP benutzen (#TempTabelle). Denk immer dran daß mehrere Benutzer gleichzeitig die SP aufrufen können, und sich somit deine Eintragungen in der Temp Tabelle überschneiden können.
|
Re: MS-SQL Procedure & Resultset???
öhm das ist wahr ^^
So hab ich das noch nicht gesehen :) Bin grad neu eingestiegen in der datenbank sache... Wie erstelle ich so eine #Temptable? |
Re: MS-SQL Procedure & Resultset???
Zitat:
SQL-Code:
create table #temp ....
|
Re: MS-SQL Procedure & Resultset???
also nur ein # vor dem Tabellennamen?
Und die wird dann auch zerstört zum schluss? Brauch ich mich nicht drum zu kümmern? BYE |
Re: MS-SQL Procedure & Resultset???
Zitat:
Gruß, Tom |
Re: MS-SQL Procedure & Resultset???
So, wie Du es in Deinem 2. Post gezeigt hast, sollte es Dir ein Recordset zurückliefern. Wenn Du mit temporären Tabellen in Multi-Userumgebungen arbeitest, solltest Du Dir eine Routine schreiben, die eine eindeutig benamste Tabelle erzeugt. somit ist gewährleistet, dass Du immer allein (aus Sicht der SP) auf der Tabelle rumwerkelst. Allerdings mußt Du dann auf dynamic SQL zurückgreifen. Wenn Dir das neu ist, dann auch dazu ein kleines Beispiel. Viel Spass!
Beispiel:
SQL-Code:
Gruß
-- erzeugt eindeutigen Tabellennamen
CREATE FUNCTION GetTmpTableName( @Tabelle sysname) RETURNS varchar(2000) AS BEGIN DECLARE @TmpTable varchar(2000) OUTPUT , @i int SET @i = 0 SET @TmpTable = '##Tmp_'+@Tabelle WHILE object_id('tempdb..'+@TmpTable, 'U') is not null BEGIN SET @i = @i+1 SET @TmpTable = '##Tmp_'+@Tabelle+convert(varchar,@i) END RETURN (@TmpTable) END -- DemoSP für Dynamic SQL CREATE PROCEDURE DoSomething AS BEGIN DECLARE @SQL nvarchar(4000) -- Statements für dynSQL , @PARA nvarchar(4000) -- Variablen für dynSQL , @TMP_TABELLE varchar(255) -- Temporäre Tabelle , @DerCursor Cursor -- dynamischer Cursor , @DeineFeldEinsVariable int -- irgendwas halt -- Aufruf der obigen Funktion, um eindeutigen Tabellennamen zu erhalten SET @TMP_TABELLE = GetTmpTableName('MeineTmpTabelle') -- Statement, um diese Tabelle zu erzeugen und mit Werten zu füllen SET @SQL = 'INSERT INTO '+@TMP_TABELLE+' SELECT FeldEins,* FROM BlaBla' -- ausführen EXEC @SQL --Statement, um einen dynamischen Cursor für diese Tabelle anzulegen SET @SQL = 'SET @DerCursor = CURSOR FOR SELECT FeldEins FROM '+ @TMP_TABELLE+ '; Open @DerCursor' --Parameter für aufruf von sp_executesql erzeugen SET @PARA = '@DerCursor CURSOR OUTPUT' -- dynSQL ausführen EXEC sp_executesql @SQL, @PARA, @DerCursor -- mit dem dynamischen Cursor arbeiten FETCH NEXT FROM @DerCursor into @DeineFeldEinsVariable WHILE @@FETCH_STATUS = 0 BEGIN -- Mach was FETCH NEXT FROM @DerCursor into @DeineFeldEinsVariable END CLOSE @DerCursor DEALLOCATE @DerCursor -- einfache Abfrage auf die dyn. erzeugte temp. Tabelle SET @SQL = 'SELECT * FROM '@TMP_TABELLE' EXEC @SQL -- Tabelle löschen SET @SQL = 'DROP TABLE '+@TMP_TABELLE EXEC @SQL END |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz