# Felder Vergleich in SQL Server



## wreid (24. April 2009)

DB: SQL Server

Hallo

ich habe ein Problem beim Felder-Vergleich in SQL-Server. Folgendes möchte ich erreichen:

```
INSERT INTO [Tmp] ([AdresseID], [OwnerID], [AbrechZiff], [VorgabeIdent]) 
SELECT[Adresse].[Nummer] as [AdresseID], '000' As [OwnerID], (Verteilerkennzeichen =  '@A') as AbrechZiff,  [Adresse].[VorgabeIdent]
FROM  [Adresse]
WHERE  [Adresse].[Satzart] = 600 AND
                [Adresse].[Deaktiviert] = 0 AND 
                [Adresse].[Verteilerkennzeichen] = '@A'
```
Ich möchte aus der Tabelle Adresse drei Spalten auslesen, vierte Spalte ist eine Dummy Spalte. Falls der Wert in der Spalte VerteilerKennzeichen = @A (Spalte ist varchar(2)) soll es als Boolean-Wert in die neue Spalte AbrechZiff geschrieben werden. 

Die gepostete SQL Abfrage funktioniert unter Access aber nicht unter SQL Server, folgender Fehler tritt auf:
Meldung 102, Ebene 15, Status 1, Zeile 2
Falsche Syntax in der Nähe von '='. Das bezieht sich auf --> (Verteilerkennzeichen =  '@A') as AbrechZiff.

Benötige Hilfe beim Vergleich.

Gruß
wreid


----------



## Biber2 (24. April 2009)

Moin wreid,

das sind ja gleich mehrere Problemchen... ;-)
1) wenn Du UNTEN in der WHERE-Clause ohnehin stehen hast
....WHERE ....                [Adresse].[Verteilerkennzeichen] = '@A'
--> dann brauchst Du OBEN bei den VALUEs ja nun nix mehr "errechnen". Dann ist es TRUE. Immer.
Und abends mit Beleuchtung.

2) die interessantere Frage ist doch aber, wie (bzw HTF, wie wir in Bremen sagen) bildest Du denn Deine TRUE/FALSE in den Tabellen vermeintlich ab? Was soll denn die arme DB machen, wenn Du ihr sagst "schreib ma ' eben ein TRUE in das Feld"?

Wenn mir eine meiner Praktikantinnen stolz zeigt, dass sie eine Tabelle kreiiert hat mit einem Feld
namens [AbrechZiff], welches allerdings die Werte TRUE/FALSE beinhalten soll und kurz davor steht ein Feld namens [OwnerID], das einen drei Zeichen langen Dummy-String enthält, dann kann es sein, dass sie einen Bus später nach Hause fahren muss.

Konstruktiver ausgedrückt. wenn Du nun irgendwie True/False abbilden willst auf dem MSSQLServer, dann hast Du halt kein Bit-Feld wie im Access, das nur zwei Zustände haben kann (leuchtet/leuchtet nicht). Sondern Du musst Dir selbst eine Konvention überlegen.
Meinetwegen CHAR(1) mit 'T' und 'F' als erlaubten Werten oder '0' und '1' oder 'J'/'N'  oder ein numerisches Feld mit einer Constraint, die nur 0 und 1 erlaubt. 

Wenn wir mal annehmen, dass es bei dir so ein Flag-Feld [AbrechFlag], numeric, mit 0 für False/nicht gesetzt und 1 für True/gesetzt gäbe, dann sollte Dein Statement ungefähr so funktionieren

```
INSERT INTO [Tmp] ([AdresseID], [OwnerID], [AbrechFlag], [VorgabeIdent]) 
SELECT a.[Nummer] , '000' , 1,  a.[VorgabeIdent]
FROM  [Adresse] a
WHERE  a.[Satzart] = 600 AND
                a.[Deaktiviert] = 0 AND 
                a.[Verteilerkennzeichen] = '@A'
```

Wenn keine "ist = '@A'"-Einschränkung in der WHERE-Clause sichergestellt ist:

```
INSERT INTO [Tmp] ([AdresseID], [OwnerID], [AbrechFlag], [VorgabeIdent]) 
SELECT a.[Nummer] , '000' , 
Case 
   When a.[Verteilerkennzeichen] = '@A' Then 1
   Else 0
End,
 a.[VorgabeIdent]
FROM  [Adresse] a
WHERE  a.[Satzart] = 600 AND   a.[Deaktiviert] = 0 AND
```

Grüße
Biber


----------



## wreid (26. April 2009)

Hallo Biber2

ich danke dir für deine Antwort und deinen Anstrengungen, mir zu helfen.

Deinem Annahmeversuch meine Tabelle zu erahnen muss ich dir sagen, das du daneben liegst, die dargestellte Tabelle ist nur eine Testtabelle, für die dargestellte Frage es hat nichts mit der eigentlichen Tabelle zu tun.

Dennoch hat mir deine Lösung geholfen, mein Fehler zu erkennen und zu beheben  ;-).

Gruß
wreid


----------

