Announcement

Collapse
No announcement yet.

Generator unter SQl Server

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

  • Generator unter SQl Server

    Hi,
    <br>
    <br>gibt es Generatoren unter MS SQL Srever 7?
    <br>D.h. ich möchte über eine Generator z.B. die Rechnungsnummer hoch zählen.
    <br>
    <br>Danke!
    <br>
    <br>mfg
    <br>PS

  • #2
    Hallo,

    beim Microsoft SQL Server 7/2000 ist dafür die Kennzeichnung über <b>IDENTITY</B> zuständig:
    <pre>
    CREATE TABLE TestTbl (
    ReNr INTEGER NOT NULL IDENTITY PRIMARY KEY,
    Wert VARCHAR(10))
    GO
    </pre>
    Über IDENTITY(x,y) kann man zudem Startwert und Schrittweite festlegen. Wird nichts angegeben, gilt (1,1)

    Comment


    • #3
      Hi,
      <br>
      <br>Danke!
      <br>
      <br>Habe gedacht es würde noch eine andere Möglichkeit geben, um z.B. die folgende Nummer zu erstellen:
      <br>200100123 steht für ReNr 123 im Jahr 2001
      <br>200200123 steht für ReNr 123 im Jahr 2002
      <br>
      <br>Problem ist nur, das eine Identity Spalte schwer vom User zu ändern ist, wenn dieser das nächste dokument (200100001) doch noch im Jahr 2000 haben möchte.
      <br>
      <br>Ich habe schon öffter mit einer ID-Tabelle gearbeitet.
      <br>Tabellenname varchar
      <br>ID int
      <br>
      <br>nun konnte man im Programm über getid(tabellenname) (eigene prozedur)die neue ID bekommen. Aber ich weiß nicht genau wie sicher das ist.
      Wenn ich über getid eine neue ID erfrage, so wird sie direkt in GetID hochgezählt. Was passiert wenn zwei Anfragen nahezu gleichzeitig an getID gerichtet werden. Könnte es da im ungünstigsten Falle dazu kommen, das eine ID doppelt vergeben wird?
      <br>GetID sieht ungefähr so aus:
      <br>Select ID from tbl_ID where Tabellenname = @tblname
      <br>update tbl_ID set id = id + 1 where Tabellenname = @tblname
      <br>
      <br>mfg
      <br>P

      Comment


      • #4
        Hallo,

        die Hilfstabelle ist im Mehrbenutzerbetrieb nur dann eindeutig und sicher, wenn die folgenden Regeln eingehalten werden: <br>
        1. Transaktion starten <br>
        2. Zuerst zählt die UPDATE-Anweisung den Wert hoch <br>
        3. Danach ermittelt SELECT den Wert <br>
        4. Transaktion beenden

        Wenn 2 Datenbankbenutzer zur gleichen Zeit diese UDF oder Stored Procedure aufrufen, gibt es dank der X-Locks für die Schreibsperre (Schritt 2) kein Schlupfloch

        Comment


        • #5
          Ich habe folgenden Code benutzt:
          <pre>
          EXEC sp_addtype @owner=dbo, @typename=d_Id ,@phystype='INTEGER';
          EXEC sp_addtype @owner=dbo, @typename=d_Name ,@phystype='VARCHAR(31)';

          CREATE TABLE GenIds
          (gid_Generator d_Id
          ,gid_TableName d_Name
          );

          INSERT GenIds (gid_Generator,gid_TableName) VALUES (1,"IDGEN")

          CREATE PROCEDURE IncGen
          (@tableName d_Name
          ,@increment d_Id
          ,@result d_Id OUTPUT
          ) AS
          -- 25-Oct-01 [email protected]/Troy Wolf([email protected]) 01-Aug-01
          SET NOCOUNT OFF
          BEGIN TRANSACTION
          UPDATE GenIds
          SET @result = gid_Generator = gid_Generator + @increment
          WHERE gid_TableName = @tableName
          COMMIT TRANSACTION
          -- Procend IncGen
          </pre&gt

          Comment


          • #6
            Danke!
            <br>
            <br>mfg
            <br>p

            Comment

            Working...
            X