Einzelnen Beitrag anzeigen

Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#10

Re: MS-SQL Procedure & Resultset???

  Alt 8. Nov 2004, 15:51
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:
-- 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
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat