2016-09-28 5 views
2

Ich habe einige Spalten mit einem bit-Datentyp. Der Endanwender möchte jetzt eine N/A Option, also was ich vor einem Bit zur Erfassung von "Ja/Nein" brauchte (1 ist ja und 0 ist nein) Ich muss jetzt drei Optionen haben Ja/Nein/NA die ich speichern kann nur als Text in einer varchar.Konvertieren von Bit-Datentyp in VarChar in SQL Server

Gibt es eine Möglichkeit, die Datentypen der Spalten bit-varchar und auch die aktuellen Datensätze Daten aktualisieren zu ändern, wo alle 0'en ich auf „Nein“ und 1'en ich Änderung auf „Ja“ ändern?

Antwort

8

umbenennen Warum nicht einfach NULL verwenden, um "n/a" zu bedeuten?

Verwenden Sie andernfalls TINYINT mit einer Nachschlagetabelle mit den Werten 0, 1 und 2 (oder vielleicht 1, 2 und 3) und deren Bedeutung. Dann fügen Sie einen FK zwischen den beiden Tabellen hinzu, um zu erzwingen, dass nur diese Werte eingegeben werden.

Die letzte Wahl wäre, mit einer CHAR(1) Spalte zu gehen. Dies wäre in Ordnung nur wenn Sie auch eine binäre Sortierung angegeben, wie Latin1_General_100_BIN2. Die binäre Sortierung macht es so, dass Sie die Leistung gegenüber den anderen beiden Optionen nicht verlieren. Ohne die binäre Sortierung vergleicht die Zeichenkettenspalte Werte mit linguistischen Regeln, die zusätzliche Zeit benötigen, aber für diese Verwendung keine Bedeutung haben. Sie benötigen auch einen AFTER INSERT, UPDATE Trigger zu ersten UPPER() diesen Wert für die Konsistenz und dann erzwingen, dass alle Werte entweder Y, oder A (für "n/a") sind. Dies ist besser lesbar als 0, 1 und 2 (über TINYINT) und genauso effizient für die Suche, und auch nur 1 Byte, ABER Verwendungen müssen daran denken, nur Großbuchstaben anzugeben, sonst erhalten sie möglicherweise nicht die erwarteten Ergebnisse .

Es gibt keinen Grund bei allenVARCHAR(3) zu verwenden und speichern Sie die vollständigen Werte N/A/Yes/No, es sei denn, Sie nicht nur über das System Pflege immer langsamer ;-).

+2

+1000 zu diesem. Ein Bit-Datentyp hat keine 2 Werte, er hat 3. 1, 0 und NULL. –

+1

Tolle Idee und die einfachste zu implementieren, da ich die DB in Ruhe lassen und nur den Code ändern kann. Vielen Dank! –

+1

@SeanLange Danke :). Ich bin mir nicht sicher, ob Sie jemals SilverLight-Entwicklung/XAML durcheinander gebracht haben, aber das war die einzige Umgebung, in der ich ein trinäres boolesches Kontrollkästchen als Formularelement angeboten habe. Sie könnten es tatsächlich überprüfen, deaktivieren Sie es und dann deaktivieren Sie es! Unset wäre ein Kontrollkästchen, das in der Regel schattiert ist und sich deutlich vom Häkchen unterscheidet. Es war sehr nett. –

0
  1. eine neue varchar Spalte
  2. Update es
  3. auf der bestehenden Bit Spalte basierend Fügen Sie die Bit-Spalte entfernen
  4. (optionaly) Name die neue Spalte der alten Spalte
0

Eigentlich char (3) würde mehr Raum effizient

oder tinyint mit FK-Tabelle verwenden, wie scutzly vorgeschlagen

ich tot war tot war überrascht, aber ich in der Lage kann nur Bit konvertieren char (3) mit Rechtsklick Design in SSMS.

0
Alter Table TableName 
Alter Column ColumnName Varchar(3) 

Update TableName 
Set ColumnName = 'Yes' 
Where ColumnName = '1' 

Update TableName 
Set ColumnName = 'No' 
Where ColumnName = '0' 
+0

Ich werde nicht downvote, aber ich werde darauf hinweisen, dass es keinen Vorteil hat, diese Änderung zu machen, und in der Tat wird es Abfragen gegen dieses Feld verlangsamen und mehr Speicherplatz sowohl auf der Festplatte als auch im Pufferpool benötigen. –

Verwandte Themen