Announcement

Collapse
No announcement yet.

Prozedur-Problem

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

  • Prozedur-Problem

    Hi,<BR><BR>

    ich habe eine Prozedur:
    <PRE>
    CREATE PROCEDURE anlegen (
    Att1 integer,
    Att2 char(1),
    Att3 integer,
    Att4 integer)

    BEGIN
    INSERT INTO Tabelle(Sp1, Sp2, Sp3, Sp4)
    VALUES (Att1, Att2, Att3, Att4);
    END;
    </PRE>
    Ich bekomme nun die Meldung, dass Sp1 in Tabelle tabelle kein Nullwert sein kann, aber ich weise ihm doch durch Att1 einen Wert zu. Wo liegt also das Problem. Versuche ich die INSERT-Anweisung ganz allein, also nicht in einer Prozedur eingebettet, funktioniert es. Warum also hier nicht?
    <BR><BR>
    Weiss jemand hilfe?

  • #2
    Hallo,

    die Frage ist, welchen Wert der Aufrufer der SP als Parameter-Wert übergibt. Der folgende Test für den MS SQL Server 2000 verdeutlicht das Problem:
    <pre>
    USE tempdb
    GO

    CREATE TABLE Karen (
    Att1 integer NOT NULL,
    Att2 char(1) NOT NULL,
    Att3 integer NOT NULL,
    Att4 integer NOT NULL)
    GO

    CREATE PROCEDURE anlegen (
    @Att1 integer,
    @Att2 char(1),
    @Att3 integer,
    @Att4 integer)
    AS
    INSERT INTO Karen(Att1, Att2, Att3, Att4)
    VALUES (@Att1, @Att2, @Att3, @Att4);
    GO

    -- SP im Query Analyzer testen
    DECLARE @Att1 INTEGER
    DECLARE @Att2 CHAR(1)
    DECLARE @Att3 INTEGER
    DECLARE @Att4 INTEGER
    SELECT @Att2 = 'A'
    SELECT @Att3 = 3
    SELECT @Att4 = 4
    EXECUTE anlegen @Att1, @Att2, @Att3, @Att4
    </pre>
    Ergebnis: <i>"Der Wert NULL kann in die Att1-Spalte, tempdb.dbo.Karen-Tabelle, nicht eingefügt werden. Die Spalte lässt NULL-Werte nicht zu. Fehler bei INSERT.
    Die Anweisung wurde beendet."</i>

    Nur dann, wenn für alle Parameter ein Wert übergeben wird, verstösst die INSERT-Anweisung nicht gegen den NOT NULL-Constraint der Tabelle:
    <pre>
    -- SP im Query Analyzer testen
    DECLARE @Att1 INTEGER
    DECLARE @Att2 CHAR(1)
    DECLARE @Att3 INTEGER
    DECLARE @Att4 INTEGER
    SELECT @Att1 = 0
    SELECT @Att2 = 'A'
    SELECT @Att3 = 3
    SELECT @Att4 = 4
    EXECUTE anlegen @Att1, @Att2, @Att3, @Att4
    </pre&gt

    Comment


    • #3
      ich habe aber überall einen WErt übergeben!

      Ich habe den Aufruf so gemacht:
      call anlegen (5, 'L', 5, 5);

      somit ist doch überall ein Wert vorhanden gewesen, ich habe keine bei null belassen

      Comment


      • #4
        Hallo,

        werden auch wirklich alle NOT NULL-Spalten der Tabelle aufgelistet, oder andersrum gefragt, gibt es ausser Sp1, Sp2, Sp3 und Sp4 noch andere Spalten dieser Tabelle?

        Wenn nicht, wie sieht die CREATE TABLE-Anweisung aus und treibt eventuell irgendwo ein Trigger sein Unwesen

        Comment


        • #5
          Es gibt einen Trigger, der immer eine neue Nummer vergeben soll, wenn ein Neuer Eintrag hinzugefügt werden soll. Liegt darin das Problem

          Comment

          Working...
          X