Announcement

Collapse
No announcement yet.

Datumsformat in dyn. stored Procedures

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

  • Datumsformat in dyn. stored Procedures

    Hallo Ihr Profis,
    ich habe ein Problem mit einer dynamischen stored procedure,
    die ungefähr so aussieht:

    CREATE PROCEDURE [dbo].[sp_DUPLIC] @TN char(50),
    @FN1 char(50), @V1 char(50), @KF char(50), @ID char(10),
    @BEGINN char(10), @ENDE char(10) AS
    DECLARE @s char(255)
    set @s= 'select * from dbo.' + @TN + 'where ( ' + @KF + ' <> ' + @ID +' )
    and ( ' + @FN1+ ' = ' + @V1 + ' )' + ' and
    (( BEGINN <= ' + @ENDE + ' ) and ( ENDE >= ' + @BEGINN+' ))'

    execute (@s)
    GO

    das Teilt dient dazu in verschiedenen "Stamm" - Tabellen zu prüfen ob Werte (@V1)
    nicht im gleichen Zeitraum doppelt vorhanden sind.

    Das Problem liegt darin, dass ich nicht weiß, wie in einem String das Datumsformat
    korrekt angegeben werden muss.
    Ich habe also mit "DD.MM.YYYY" und mit "YYYY-MM-DD" probiert aber es klappt
    nicht. Also weiß jemand wie ich das Datum übergeben muss?
    Hendrik

  • #2
    Hallo Hendrik,<BR><BR>ich nehme an, dass die Felder BEGINN und ENDE vom Typ DATETIME sind. Eine ganz einfache Lösung wäre die, dass du die Variablen @Beginn und @Ende nicht als CHAR(8) deklarierst. Die Abfrage kann dann über einen String erfolgen, der implizit umgewandelt wird. Dabei nehmne ich immer folgendes Format: 'YYYYMMDD'. Dabei ist es dann unerheblich welche Sprache auf dem Server eingestellt ist usw., das klappt immer! Allerdings musst du, weil du ja einen String zusammen baust und auch einen String darstellen willst, das Hochkomma verdoppeln:<BR><BR>...and ((BEGINN <= ''' + @ENDE + ''') and...<BR>Ergebnis: ...and ((BEGINN <= '20030109') and...<BR><BR>Zur Verdeutlichung:<BR><BR>declare @dtAnfang datetime<BR>set @dtAnfang = '20030109' --wird implizit umgewandelt<BR>print @dtAnfang<BR><BR>Ich denke, das müsste helfen.<BR><BR>Ola

    Comment


    • #3
      Hallo Hendrik,<BR><BR>streiche bitte einfach den zweiten Satz. Natürlich sollst du die Variablen @Beginn und @Ende als CHAR(8) deklarieren!!<BR><BR>Sorry, Ola

      Comment


      • #4
        Hallo Olaf,
        erstmal vielen Dank für den Tipp, werde es gleich ausprobieren
        und melde mich dann noch mal!<p>
        Hendri

        Comment


        • #5
          Hallo Olaf,
          leider hat das nicht geklappt, bekommme die Fehlermeldung<br>
          'Falsche Syntax in der Nähe von 20030101' also mein Beginn - Datum.<br>
          Die Parameterübergabe in Delphi sieht so aus:<br>
          <PRE>
          Parameters[6].value:=QuotedStr(FormatDateTime('yyyymmdd',BEGINN ));</PRE><br>
          Hast Du vieleicht noch 'nen Tipp?<p>
          Hendri

          Comment


          • #6
            Hallo Hendrik,<BR><BR>du brauchst eigentlich keinen QuotedString, einfach als String übergeben müsste reichen, wenn du innerhalb der Procedure die Hochkommas verdoppelt hast:<BR><BR>Parameters[6].value:=FormatDateTime('yyyymmdd',BEGINN);<BR><BR> Das müsste klappen.<BR>Aber vielleicht, um sicher zu gehen, kannst du ja in deiner Procedure den zusammengebauten String vor der Ausführung in eine Log-Tabelle schreiben lassen. Dann ist der Fehler recht schnell zu entdecken. Schreibe den Befehl bei Bedarf doch einfach nochmal hierher!<PRE>
            CREATE PROCEDURE [dbo].[sp_DUPLIC]
            @TN char(50),
            @FN1 char(50),
            @V1 char(50),
            @KF char(50),
            @ID char(10),
            @BEGINN char(10),
            @ENDE char(10)
            AS

            DECLARE @s char(255)
            set @s= 'select * from dbo.' + @TN +
            ' where ( ' + @KF + ' <> ' + @ID +
            ' ) and ( ' + @FN1+ ' = ' + @V1 + ' )' +
            ' and (( BEGINN <= ''' + @ENDE + ''' ) and ( ENDE >= ''' + @BEGINN+''' ))'

            --create table ExecLog(ID int not null identity(1, 1), Befehl varchar(4000))
            insert into ExecLog(@s)

            execute (@s) GO

            </PRE> <BR>Ola

            Comment


            • #7
              Danke Olaf,<br>
              das werde ich gleich noch mal probieren<br>
              Hendri

              Comment


              • #8
                Hallo Olaf,<br>
                ich hab das immer noch nicht im Griff<br>
                bei deinem Vorschlag (ohne QuotedStr) bringt er <br>
                "Öffnendes Anführungszeichen vor der Zeichenfolge ... " dem Wert von @ENDE<br>
                mit QuotedStr -> "Falsche Syntax in der Nähe von ..." dem Wert von @BEGINN<br>
                das mit der ExecLog hat auch nicht hingehauen, obwohl sie angelegt ist<br>
                Fehlermeldung "ungültiger Objektname dbo.ExecLog"<br>
                ?????<br>
                Hendri

                Comment


                • #9
                  Hallo Hendrik,<BR><BR>na ja, da kommt gleich einiges zusammen....!Ich würde dir empfehlen zuerst die StoredProcedure ganz normal im Query Analyser auszuführen bzw. zu testen bis erst einmal dort alles läuft. Der nächste Schritt wäre dann der Aufruf aus Delphi. Lass doch erst einmal das Exec(@s) weg und schreibe print(@s). Die Ausgabe kannst du dann kopieren und testen.<BR><BR>Viel Erfolg, Ola

                  Comment

                  Working...
                  X