Announcement

Collapse
No announcement yet.

frage zu update-syntax, bin newbie

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

  • frage zu update-syntax, bin newbie

    hallo,
    <br>ich habe folgendes problemchen:
    <br>habe eine tabelle mit folgenden feldnamen:
    <br>langtext, info vom datentyp text
    <br>flag vom typ bit

    <p>nun möchte ich ein script (unter sql 2000)erzeugen, das wie folgt aussieht:

    <br>declare @Kopftext as vchar(100), @Fusstext as vchar(100)
    <br>set @Kopftext='Text1'
    <br>set @Fusstext='Text2'

    <br>update dbo.tabelle set info= @Kopftext + langtext + @Fusstext where flag=1

    <p>(wie würde das gleiche für eine insert into-anweisung aussehen?)

    <br>beim aufruf dieses scriptes erhalte ich eine fehlermeldung:"Falsche Syntax in der Nähe von 'info'.
    wie lautet die richtige syntax? in der onlinehilfe von mssql konnte ich leider nichts über feld/zeichenvekettung diesbezüglich finden, oder doch?
    danke schon jetzt für einen vorschlag

  • #2
    Hallo Gregor,

    was ich mal so an Fehlern sehe:

    a) die Definition von kopftext/fusstext ist falsch - muss varchar sein und nicht vchar

    b) das '+' geht nur für zeichenketten, Datentyp "text" gehört nicht dazu, damit ist das auch nicht möglich, müsstest statt text eben varchar(4000) oder so verwenden.

    bye,
    Helmu

    Comment


    • #3
      hallo helmut,
      danke erst einmal für die schnelle antwort.

      <br>zu a): klar, varchar war auch gemeint, mein fehler.

      <br>zu b):
      datentyp für langtext ist leider vorgegeben, kann d.h. nicht geändert werden.

      <br>kann man den inhalt aus langtext in eine variable schreiben (mit der gefahr auf verkürzung/abschneiden des inhaltes, da varchar max. auf 4000 zeichen begrenzt ist),diese variable dann verknüpfen, vielleicht so:

      <br>declare @Kopftext as varchar(100), @Fusstext as varchar(100), @temp as varchar(4000)
      <br>set @Kopftext='Text1'
      <br>set @Fusstext='Text2'
      <br>set @temp=langtext bzw. absolut dbo.tabelle.langtext

      <p>update dbo.tabelle set info= @Kopftext + @temp + @Fusstext where flag=1

      <p>ich hoffe, oben genanntes zeigt, was ich meine. oder kann ich generell datenfelder vom typ text etc. vergessen bezüglich datenmanipulation (stichwort substring, anzahl der zeichen etc.)
      für eine antwort wäre ich dankbar.

      <p>gruss gregor

      <p>p.s. bin auf der suche nach praktischen scriptbeispielen, wenn es denn so etwas im netz gibt, die theoretischen (doku-mssql)erklärungen sind fernab der praxis

      Comment


      • #4
        Hallo,

        solange die Puffer-Variablen groß genug ist, könnte man folgendes machen (in der Voreinstellung liefert SELECT bis zu 2 GByte Textlänge zurück, die SET TEXTSIZE-Anweisung begrenzt dies bis zur maximalen Größe der Hilfsvariable):
        <pre>
        <b>USE</b> tempdb
        <b>GO</b>
        <br>
        <b>CREATE</b> <b>TABLE</b> BLObTest
        (
        recid <b>INTEGER</b> <b>NOT</b> <b>NULL</b> <b>IDENTITY</b> <b>PRIMARY</b> <b>KEY</b>,
        langtext <b>TEXT</b>,
        info <b>TEXT</b>,
        flag <b>BIT</b>
        )
        <b>GO</b>
        <br>
        <b>INSERT</b> <b>INTO</b> BLObTest (langtext, info, flag) <b>VALUES</b> (<font color="#9933CC">'Langer text...'</font>,<font color="#9933CC">'Info-text'</font>, 0)
        <b>INSERT</b> <b>INTO</b> BLObTest (langtext, info, flag) <b>VALUES</b> (<font color="#9933CC">'Der Inhalt von Langtext'</font>,<font color="#9933CC">'Info'</font>, 1)
        <b>GO</b>
        <br>
        <br>
        <b>DECLARE</b> @Kopftext <b>AS</b> <b>VARCHAR</b>(100), @Fusstext <b>AS</b> <b>VARCHAR</b>(100)
        <b>DECLARE</b> @langtextbuffer <b>AS</b> <b>VARCHAR</b>(4000)
        <font color="#008080">-- TEXTSIZE zur Sicherheit auf maximale Variablengröße begrenzen</font>
        <b>SET</b> TEXTSIZE 4000
        <font color="#008080">--</font>
        <b>SET</b> @Kopftext=<font color="#9933CC">'Text1'</font>
        <b>SET</b> @Fusstext=<font color="#9933CC">'Text2'</font>
        <font color="#008080">-- BLOb-Inhalt in Hilfsvariable ablegen</font>
        <b>SELECT</b> @langtextbuffer = langtext <b>FROM</b> dbo.BLObTest <b>WHERE</b> recid = 2
        <font color="#008080">-- </font>
        <b>UPDATE</b> dbo.BLObTest <b>SET</b>
        langtext = @Kopftext + @langtextbuffer + @Fusstext
        <b>WHERE</b>
        recid = 2
        <b>GO</b>
        <br>
        <font color="#008080">-- Ergebnis testen</font>
        <b>SELECT</b> * <b>FROM</b> dbo.BLObTest <b>WHERE</b> recid = 2</pre>
        Als Ergebnis wird "<i>Text1Der Inhalt von LangtextText2 </I>" zurückgeliefert

        Comment


        • #5
          hallo andreas,
          vielen dank für den lösungsansatz

          Comment


          • #6
            hallo, ich habe versucht, das script so umzuschreiben, dass alle datensätze mit flag=1 geändert werden sollen.
            nur: das ergbenis ist, dass nur ein einziger datensatz geändert wird und nicht wie gewollt alle, bei denen der flag=1 gesetzt ist.

            hier das script:
            <pre>
            DECLARE @Kopftext AS VARCHAR(100), @Fusstext AS VARCHAR(100)
            DECLARE @langtextbuffer AS VARCHAR(4000)
            declare @zaehler as int , @anzahl as int
            --
            SET TEXTSIZE 4000
            --
            SET @Kopftext='Text1 '
            SET @Fusstext=' Text2'
            --
            --
            select @anzahl = count(*) from dbo.artikel where shopfreigabeflg = 1
            set @zaehler = 0
            --
            while @zaehler <= @anzahl
            begin
            SELECT @langtextbuffer = langtext, @zaehler = ID FROM dbo.artikel WHERE shopfreigabeflg = 1
            --
            UPDATE dbo.artikel SET
            info = @Kopftext + @langtextbuffer + @Fusstext
            WHERE ID = @zaehler and shopfreigabeflg = 1
            --
            set @zaehler = @zaehler + 1
            --
            if @zaehler = @anzahl
            break
            else
            continue
            end
            GO

            </pre>

            ich weiss nun, dass eine while-schleife - wie o.g. - datenbanktechnisch schlecht gewählt ist (hab' ich mir von einem guten freund sagen lassen). ich wäre für einen lösungsvorschlag sehr dankbar.

            gruss grego

            Comment

            Working...
            X