Announcement

Collapse
No announcement yet.

SP mit mit SELECT und UPDATE

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

  • SP mit mit SELECT und UPDATE

    Hallo,

    ich bin Neuling in Bezug auf SP's unter MS SQL.

    Habe folgendes Problem:

    In einer Tabelle stehen Defaultwerte zu Feldern einer Tabelle.
    Bei der Neuanlage eines Datensatzes sollen dann die Felder mit den entspr. Defaultwerten belegt werden.

    Kenne mich mit der Syntax von TSQL zu wenig aus bzw. erste Versuche schlugen fehl:

    Hier mein bish. Versuch:

    CREATE PROCEDURE dbo.stprDetDefaultValues
    @TableName VarChar(20),
    @Nr Varchar(10)

    AS
    DECLARE @Feld Varchar(20), @Wert Varchar(50)

    SELECT @Feld = Feld, @Wert = Wert
    FROM dbo.DefaultCFG WITH (NOLOCK)
    WHERE Tabelle = @TableName

    UPDATE Rechnung SET @Feld = @Wert
    WHERE Nr = @Nr

    Die Select-abfrage liefert i.d.R. auch mehr als eine Zeile zurück, d.h. irgendwie benötige ich auch noch eine For-While-Schleife.

    Bin für Hilfe dankbar.
    Gruss
    Jürgen

  • #2
    Hallo,
    das folgende Beispiel zeigt einen möglichen Lösungsansatz. Ein neuer Datensatz wird nur über eine Stored Procedure in die Tabelle eingefügt, wobei die SP für jeden Parameter prüft, ob der Zustand NULL übergeben wurde. Wenn ja, wird aus der Hilfstabelle der aktuelle Default-Wert ausgelesen, um vor dem INSERT-Aufruf die Parameter-Werte auszutauschen.
    <code>
    USE tempdb
    <b>GO</b>
    -- Vorbelegungs-Tabelle
    <b>CREATE</b> <b>TABLE</b> DefaultCFG
    (
    rec_id <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
    tabelle NVARCHAR(19) <b>NOT</b> <b>NULL</b>,
    feld NVARCHAR(19) <b>NOT</b> <b>NULL</b>,
    <b>value</b> NVARCHAR(19) <b>NOT</b> <b>NULL</b>
    )
    <b>GO</b>
    <b>INSERT</b> <b>INTO</b> dbo.DefaultCFG (tabelle,feld,<b>value</b>) <b>VALUES</b>(<font color="#9933CC">'T1'</font>,<font color="#9933CC">'f1'</font>,<font color="#9933CC">'v1'</font>)
    <b>INSERT</b> <b>INTO</b> dbo.DefaultCFG (tabelle,feld,<b>value</b>) <b>VALUES</b>(<font color="#9933CC">'T1'</font>,<font color="#9933CC">'f2'</font>,<font color="#9933CC">'v2'</font>)
    <b>INSERT</b> <b>INTO</b> dbo.DefaultCFG (tabelle,feld,<b>value</b>) <b>VALUES</b>(<font color="#9933CC">'T1'</font>,<font color="#9933CC">'f3'</font>,<font color="#9933CC">'v3'</font>)
    <b>GO</b>
    -- Nutztabelle
    <b>CREATE</b> <b>TABLE</b> T1
    (
    t1_id <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
    f1 NVARCHAR(19) <b>NOT</b> <b>NULL</b>,
    f2 NVARCHAR(19) <b>NOT</b> <b>NULL</b>,
    f3 NVARCHAR(19) <b>NOT</b> <b>NULL</b>,
    )
    <b>GO</b>
    -- Neuen Datensatz <b>in</b> T1 anlegen, dabei alle <b>NULL</b>-Parameter durch die
    -- <b>Default</b>-Wert aus der Hilfstabelle DefaultCFG ersetzen
    <b>CREATE</b> <b>PROCEDURE</b> spT1Insert
    (
    @f1 NVARCHAR(19),
    @f2 NVARCHAR(19),
    @f3 NVARCHAR(19)
    )
    <b>AS</b>
    <b>SET</b> NOCOUNT <b>ON</b>;
    <b>IF</b> @f1 <b>IS</b> <b>NULL</b>
    <b>BEGIN</b>
    <b>SELECT</b> @f1 = <b>value</b> <b>FROM</b> dbo.DefaultCFG <b>WHERE</b> tabelle = <font color="#9933CC">'t1'</font> <b>AND</b> feld = <font color="#9933CC">'f1'</font>
    <b>END</b>
    <b>IF</b> @f2 <b>IS</b> <b>NULL</b>
    <b>BEGIN</b>
    <b>SELECT</b> @f2 = <b>value</b> <b>FROM</b> dbo.DefaultCFG <b>WHERE</b> tabelle = <font color="#9933CC">'t1'</font> <b>AND</b> feld = <font color="#9933CC">'f2'</font>
    <b>END</b>
    <b>IF</b> @f3 <b>IS</b> <b>NULL</b>
    <b>BEGIN</b>
    <b>SELECT</b> @f3 = <b>value</b> <b>FROM</b> dbo.DefaultCFG <b>WHERE</b> tabelle = <font color="#9933CC">'t1'</font> <b>AND</b> feld = <font color="#9933CC">'f3'</font>
    <b>END</b>
    <b>INSERT</b> <b>INTO</b> dbo.T1
    (f1,f2,f3)
    <b>VALUES</b>
    (@f1,@f2,@f3)
    <b>RETURN</b> @@ROWCOUNT
    <b>GO</b>
    -- <b>Test</b> 1: Alle Parameter <b>NULL</b>
    <b>EXEC</b> spT1Insert <b>NULL</b>, <b>NULL</b>, <b>NULL</b>
    -- <b>Test</b> 2: Nur einige <b>Default</b>-Werte sollen greifen
    <b>EXEC</b> spT1Insert <b>NULL</b>,<font color="#9933CC">'Test'</font>, <b>NULL</b>
    -- Ergebnis anzeigen
    <b>SELECT</b> * <b>FROM</b> dbo.T1
    </code&gt

    Comment


    • #3
      Hallo H. Kosch,

      vielen Dank für ihren Lösungsansatz.

      Meine Idee war, die zum Zeitpunkt der Neuanlage bekannten Daten in die entspr. Felder zu hinterlegen und dann im Anschluss die noch nicht belegten Felder mit Standarwerten aus einer spez. Datei per Select und Update zu belegen.

      Ich bin auch bez. der Select-Abfrage weiter gekommen, d.h. mittel Cursor kann die Ergebnismenge abgearbeitet werden.
      Nur wenn ich jetzt per Update-Befehl die Felder belegen will, rhalte ich eine Fehlermeldung.

      Hier die entspr. Zeilen der SP:
      SET @sSQL = 'UPDATE Rechnung SET ' + @Feld + ' = ' + @Wert + ' WHERE Nr = ' + @Nr
      Exec(@sSQL)

      Fehlermeldung:
      Server: Nachr.-Nr. 207, Schweregrad 16, Status 3, Zeile 1
      Ungültiger Spaltenname 'F'.

      Das unverständliche für micht ist, es gibt keinen aus der Selectabfrage für @Feld keinen Eintrag mit dem Wert 'F'.
      Die Variable @Wert wird allerdings mit 'F' belegt.

      Sind 'F' oder 'T' hier ev. irreführend?

      Danke im vorau

      Comment

      Working...
      X