2017-12-11 11 views
1

Ich habe drei Felder, die ich versuche, zu einem großen Feld zu verketten. Zwei der Felder sind Varchar, aber eins ist ein Float. In bestimmten Situationen zeigt das verkettete Feld wissenschaftliche Notation an. Das verkettete Feld sollte ein Varchar sein und die Kombination der drei Felder anzeigen, unabhängig davon, wie sie formatiert sind. Ich sehe sogar wissenschaftliche Notation, wenn ich die beiden varchar-Felder einfach verkette, wenn die Werte alle Zahlen enthalten. Warum passiert das und wie kann ich es beheben? Hier sind einige Beispiele dafür, wie ich versuche, die Verkettung zu tun:CAST numerisch zu varchar gibt wissenschaftliche Notation

Field1 = e.DocumentNo + e.Assignment + CAST(CAST([Amount in LC] as int) as nvarchar(50)) 

Field2 = CAST(e.DocumentNo + e.Assignment as varchar(255)) 

ich auch versucht hat, CONVERT verwenden und es bietet nicht das erwartete Ergebnis. DocumentNo ist ein varchar (255) und Assignment ist ein varchar (255), aber wenn ich diese Werte für jedes habe, 5115146916 und 1610000, sieht Field2 wie 5.11515E + 16 aus.

Ich habe auch versucht, CONCAT() mit den Feldern zu verwenden und es erzeugt das gleiche unerwünschte Ergebnis.

+0

@ tsqln00b Ich kann dies auf nicht neu basiert, was ich von der oben verstehen .. können Sie einen SQL-Fiddle mit Beispieldaten bauen? http://sqlfiddle.com/#!6 –

+1

http://sqlfiddle.com/#!6/f6d02/7/0 – tsqln00b

+0

Dies funktioniert für alles, wo der Betrag im LC-Feld nicht mehr als 6 Ziffern ist. CONCAT (DokumentNr, Zuordnung, [Betrag in LC]) – tsqln00b

Antwort

1

Hier gehen Sie:

IF OBJECT_ID('TEMPDB..#ConcatData','U') IS NOT NULL 
DROP TABLE #ConcatData; 

CREATE TABLE #ConcatData(
[Amount in LC] [float] NULL, 
[Assignment] [varchar](255) NULL, 
[DocumentNo] [varchar](255) NULL) 

INSERT INTO #ConcatData 
VALUES 
(-27.08, '20120295', '4820110172'), 
(10625451.5124, '20140701', '4810122475'), 
(205.5, 'TPE035948900001', '8200022827'), 
(10000000, 'TPE035948900001', '8200022827') 

SELECT DOCUMENTNO + 
     ASSIGNMENT + 
     CASE WHEN RIGHT(str([amount in lc],50,4),4) = '0000' 
       THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-5)) 
      WHEN RIGHT(str([amount in lc],50,4),3) = '000' 
       THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-3)) 
      WHEN RIGHT(str([amount in lc],50,4),2) = '00' 
       THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-2)) 
      WHEN RIGHT(str([amount in lc],50,4),1) = '0' 
       THEN ltrim(LEFT(str([amount in lc],50,4),LEN(str([amount in lc],50,4))-1)) 
      ELSE ltrim(str([amount in lc],50,4)) 
      END 
FROM #ConcatData 

Moral der Geschichte hier ist float nicht der richtige Datentyp für Ihre Spalte. Ich weiß wirklich nicht, wenn float der richtige Datentyp ...

Wie dem auch sei, die anstößigen CASE Anweisung benötigt wird, durch STR() Überschuss Dezimal-Stelle Nullen zu beseitigen. Sie könnten sogar mehr brauchen, aber das deckt Sie bis zu 4 Dezimalstellen und ich denke, Sie werden die Idee bekommen.

Eine Anmerkung, die erste entfernt 5 Zeichen anstelle von 4. Dies ist auch die . enthalten.

Ausgang:

482011017220120295-27.08 
48101224752014070110625451.5124 
8200022827TPE035948900001205.5 
8200022827TPE03594890000110000000 
Verwandte Themen