如何使用STUFF与SQL UPDATE [关闭]

问题描述 投票:-1回答:1

我有3列和字段数据类型表是十进制(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
sql sql-server database tsql sql-server-2014
1个回答
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不存储前导零。

© www.soinside.com 2019 - 2024. All rights reserved.