Announcement

Collapse
No announcement yet.

sp_executesql mit Result in Funktion Kapseln ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • sp_executesql mit Result in Funktion Kapseln ?

    Wer kann mir helfen ?
    <BR>

    CREATE FUNCTION GetNextID ( @table as varchar(50), @Field AS varchar(50)) RETURNS int
    BEGIN

    DECLARE @NextID int,
    @cmd nvarchar(200)

    SELECT @cmd = 'SELECT @d = MAX('+@Field+') FROM ' + @table

    exec sp_executesql @cmd, N'@d int OUTPUT', @NextID OUTPUT

    RETURN @NextID
    END
    go

    <BR>

    SELECT BC.GetNextID('Artikel', 'Artikel_ID')
    <BR>

    Diese funktion ist vom Quelltext richtig, kann aber nicht erstellt werden, da ich sp_executsql nicht innerhalb einer Funktion aufrufen darf. Gibt es für mich eine Alternative ?

    Gruß
    Sascha

  • #2
    Hallo,
    die Implementierung über SELECT (MAX) hat einige unerwünschte Nebenwirkungen. Zum einen ist MAX bei umfangreichen Tabellen viel zu CPU-Intensiv und zum anderen wäre die Lösung nicht Mehrbenutzertauglich. Eine Alternative könnte so aussehen:<br>
    a) Die Hilfstabelle nutzt nur einen einzigen Datensatz <br>
    b) Der UPDATE-Aufruf setzt sofort ein X-Lock auf die Hilfstabelle, so dass ein Dritter nicht in die Quere kommen kann<br>
    c) Wenn keine ID's übersprungen werden dürfen (das wird wohl der Grund gewesen sein, um <i>IDENTITY</i> nicht zu nutzen), kann der Aufruf in die gleiche Transaktion gekapselt werden, die auch den eigentlichen Datensatz (für den der neue ID-Wert benötigt wird) anlegt).
    <code>
    USE tempdb
    GO

    CREATE TABLE LastID
    (
    id INT NOT NULL PRIMARY KEY
    )
    GO
    INSERT INTO LastID (id) VALUES (0);
    GO

    CREATE PROCEDURE spGetNextID
    (
    @NewID INT OUTPUT
    )
    AS
    BEGIN
    UPDATE dbo.LastID SET @NewID = id = id + 1;
    END
    GO

    -- Testen
    DECLARE @i INT
    EXEC spGetNextID @i OUTPUT
    PRINT @i
    </code&gt

    Comment

    Working...
    X