Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SQL Server-强制转换和拆分_.net_Sql_Sql Server_Sql Server 2005_Ssis - Fatal编程技术网

.net SQL Server-强制转换和拆分

.net SQL Server-强制转换和拆分,.net,sql,sql-server,sql-server-2005,ssis,.net,Sql,Sql Server,Sql Server 2005,Ssis,查询: DECLARE @table table(XYZ VARCHAR(8) , id int) INSERT INTO @table SELECT '4000', 1 UNION ALL SELECT '3.123', 2 UNION ALL SELECT '7.0', 3 UNION ALL SELECT '80000', 4 UNION ALL SELECT NULL, 5 此部分-强制转换(XYZ为十进制(18,3))/1000不除以该值 它在小数点后给我更多的零,而不是除法。(我

查询:

DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5
此部分-
强制转换(XYZ为十进制(18,3))/1000
不除以该值

它在小数点后给我更多的零,而不是除法。(我甚至将其括在括号内,并尝试了相同的结果)

我做错什么了吗?patindex表达式参数是否正确

Ex:2000/1000 = 2000.000000
如果PATINDEX不是正确的使用方法,请告诉我?
我正在检查它是否已经是带3个小数点的小数点,否则我想除以1000。

除以1000会在小数点后给你更多的零

Expected result:
4.000
3.123
7.000
80.000

尝试此操作,将整个大小写转换为十进制(18,3):

输出:

DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5


SELECT CONVERT(decimal(18,3),CASE --nothing changes within the CASE
                                 WHEN PATINDEX('^[0-9]{1,5}[\.][0-9]{1,3}$', XYZ) = 0 THEN XYZ
                                 WHEN PATINDEX('^[0-9]{1,8}$',XYZ) = 0 THEN CAST(XYZ AS decimal(18,3))/1000
                                 ELSE NULL 
                             END
              )
FROM @table
试试这个

---------------------------------------
4000.000
3.123
7.000
80000.000
NULL

(5 row(s) affected)
编辑-要在输出中保留小数点后3位,请执行此操作

4.00000000000
3.12300000000
0.00700000000
80.00000000000
NULL
NULL
选择转换(十进制(8,3),大小写
当ISNUMERIC(XYZ)=0时,则为NULL
当CHARINDEX('.',XYZ,0)0时,则XYZ
当ISNUMERIC(XYZ)>0时,则转换(十进制(18,3),XYZ)/1000.000
否则无效
(完)
来自@table
注(8,3)定义了这一点,总精度为8位,点后3位


您可能也希望转换回varchar(8)

不,他使用的PATINDEX防止小数点后的值除以1000lol我的问题很困惑,可以更正它,2000/1000=2000.000000是我得到的不工作。如果我们除以1000,4000.000=4.000,我猜PATINDEX没有达到我的预期效果?不,不是这样,示例中的所有行都是通过第一个
时的
处理,第二个
时的
时的
处理,空行通过
时的
处理。你想用PATINDEX做什么?是的,我意识到,检查我更新的问题,我正在尝试使用regexHi匹配我有一些几乎可以避免PATINDEX的东西。跳水1000米的规则是什么?如果XYZ包含一个保留不变的小数点,如果它没有/1000?PATINDEX(Transact-SQL)返回指定表达式中模式第一次出现的起始位置,如果找不到该模式,则返回零,在所有有效的文本和字符数据类型上。@CResults-它应该始终是十进制的,但有时我们会得到错误数据4.000作为4000或2.310作为2310。所以我要做的是检查它是否不是xx.xxx格式,把它转换成十进制格式。是的,如果它包含左点it@rs我想我有你想要的东西…非常感谢这是我一直在寻找的东西,但为什么它在最后会额外增加8个0?请参阅我的编辑。我已经将精度保持在8以适合您原来的varcharyes谢谢,我不知道是什么导致它填充这么多零。您很接近,但我们不需要*1000额外的:)是的,您需要,否则您将以4.00000000 0.00312300 0.00700000 80.00000000空结束
---------------------------------------
4000.000
3.123
7.000
80000.000
NULL

(5 row(s) affected)
DECLARE @table table(XYZ VARCHAR(8) , id int)

INSERT INTO @table
SELECT '4000', 1
UNION ALL
SELECT '3.123', 2
UNION ALL
SELECT '7.0', 3
UNION ALL
SELECT '80000', 4
UNION ALL
SELECT NULL, 5
UNION ALL
SELECT 'WTF',6

SELECT CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END
  FROM @table
4.00000000000
3.12300000000
0.00700000000
80.00000000000
NULL
NULL
SELECT convert(decimal(8,3),CASE 
     WHEN ISNUMERIC(XYZ) = 0 THEN NULL
     WHEN CHARINDEX('.',XYZ,0) < LEN(XYZ)-2 AND CHARINDEX('.',XYZ,0) > 0 THEN XYZ
     WHEN ISNUMERIC(XYZ) >0  then  convert(decimal(18,3),xyz) / 1000.000
     ELSE NULL
END)
  FROM @table
select xyz, ((case when charindex('.', xyz) > 0 then cast(xyz AS decimal(18,3))*1000
                   else cast(xyz AS decimal(18,3)) end))/1000
from #table