Это основано на предположении из ранее удаленного сообщения (что у вас также есть отрицательное число).
Во-первых, поскольку вы используете decimal(38,0)
, вы не можете хранить значения с какой-либо точностью, поэтому вам также необходимо изменить тип данных.Это обеспечивает результаты, которые вы, похоже, ищете:
USE Sandbox;
GO
CREATE TABLE dbo.SampleTable (ID int,
X decimal(38,0),
Y decimal(38,0));
INSERT INTO dbo.SampleTable (ID,
X,
Y)
VALUES (1200,321121,345000),
(1201,564777,4145 ),
(1202,4567 ,121444),
(1203,12747 ,789887),
(1204,489899,124778),
(1205,-32472,-27921);
GO
--Fix the datatype
ALTER TABLE dbo.SampleTable ALTER COLUMN X decimal(10,4); --Based on data provided, may need larger scale
ALTER TABLE dbo.SampleTable ALTER COLUMN Y decimal(10,4); --Based on data provided, may need larger scale
GO
--update the data
UPDATE dbo.SampleTable
SET X = STUFF(ABS(CONVERT(int,X)),3,0,'.') * CONVERT(decimal(10,4),CASE WHEN X < 0 THEN -1.0 ELSE 1.0 END),
Y = STUFF(ABS(CONVERT(int,Y)),3,0,'.') * CONVERT(decimal(10,4),CASE WHEN Y < 0 THEN -1.0 ELSE 1.0 END);
SELECT *
FROM dbo.SampleTable;
GO
DROP TABLE dbo.SampleTable;
Обратите внимание, что вы не получите значение типа 41.45
, но вместо этого 41.4500
.Если вы не хотите отображать конечные 0, вам нужно выполнить форматирование в слое презентации (в противном случае вам придется хранить значения как varchar
, и это очень плохая идея).