我有3列的表,并且字段Data-Types是Decimal(38,0)。 所以我想更新表的每一行。实际上,数字的长度彼此不相同,我的意思是其中一些是5位数字,其中一些是7位数字,但是我想在2个第一位数字后插入'。 (十进制),例如123456应该为12.3456
我的桌子是:
+-------------+-------+-------+
| ID | X | Y |
+-------------+-------+-------+
| 1200 | 321121| 345000|
| 1201 | 564777| 4145 |
| 1202 | 4567 | 121444|
| 1203 | 12747 | 789887|
| 1204 | 489899| 124778|
+-------------+-------+-------+
我要更改此内容:
+-------------+--------+--------+
| ID | X | Y |
+-------------+--------+--------+
| 1200 | 32.1121| 34.5000|
| 1201 | 56.4777| 41.45 |
| 1202 | 45.67 | 12.1444|
| 1203 | 12.747 | 78.9887|
| 1204 | 48.9899| 12.4778|
+-------------+--------+--------+
我的代码在这里:
Update [dbo].[UTM]
SET [X] = STUFF([X],3,0,'.')
[Y] = STUFF([X],3,0,'.')
和我尝试这样:
BEGIN
DECLARE @COUNT1 int;
DECLARE @COUNT2 int;
DECLARE @TEMP_X VARCHAR(255);
DECLARE @TEMP_Y VARCHAR(255);
DECLARE @TEMP_main VARCHAR(255);
SELECT @COUNT1 = COUNT(*) FROM [UTM1];
SET @COUNT2 = 0;
WHILE(@COUNT2<@COUNT1)
BEGIN
SET @TEMP_main = (SELECT [id] from [UTM1] order by [id] desc offset @COUNT2 rows fetch next 1 rows only);
SET @TEMP_X = (SELECT [X] from [UTM1] order by [id] desc offset @COUNT2 rows fetch next 1 rows only);
SET @TEMP_Y = (SELECT [Y] from [UTM1] order by [id] desc offset @COUNT2 rows fetch next 1 rows only);
UPDATE [dbo].[UTM1]
SET [X] = CONVERT(decimal(38,0),STUFF(@TEMP_X,3,0,'.'))
,[Y] = CONVERT(decimal(38,0),STUFF(@TEMP_Y,3,0,'.'))
WHERE [id] = @TEMP_main;
SET @COUNT2 = @COUNT2 + 1
END
END
答案 0 :(得分:3)
我不会使用stuff()
-您的值看起来不像字符串,而看起来像数字。您应该进行算术运算。但是,如果列是整数,则需要先将它们转换为适当的类型:
alter table utm alter column x decimal(12, 4);
alter table utm alter column y decimal(12, 4);
然后使用除法进行更新:
Update [dbo].[UTM]
SET x = x / 10000
y = y / 10000;
编辑:
如果列为decimal(38, 0)
,则小数点后没有数字的余地。 0
是小数点右边的位数。
因此,将列的类型更改为允许数字。 (12, 4)
是一个建议。您还可以使用(38, 4)
或许多其他组合。
编辑II:
您的数据确实有问题。您无法确定“ 1”应为10.0000、01.0000、0.1000、0.0100、0.0010还是0.0001。我建议您使用正确的类型重新导入数据。
您可以进行转换-在固定列的数据类型之后。一种方法是通过字符串(如您尝试的那样):
Update [dbo].[UTM]
SET x = convert(decimal(12, 4), stuff(convert(varchar(255), x), 3, 0, '')),
y = convert(decimal(12, 4), stuff(convert(varchar(255), y), 3, 0, ''))
但是,我怀疑这很危险,因为您可能会遗漏值的前导零并转换为错误的值。 SQL中的数字类型不存储前导零。