Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
Sql 将varchar转换为float_Sql_Sql Server_Tsql_Sql Server 2016 - Fatal编程技术网

Sql 将varchar转换为float

Sql 将varchar转换为float,sql,sql-server,tsql,sql-server-2016,Sql,Sql Server,Tsql,Sql Server 2016,在SSMS中,我有一个源表和一个目标表。在源表中,有一列通常包含十进制数,但是,当输入值的用户将输入3,14而不是3.14或“未知”等时,该列偶尔会包含文本。(在源表中,技术上允许用户输入他们想要的任何内容。此规则无法更改。) 我有一个存储过程,它从源表中选择一些列,包括有问题的列,并将信息输入数据仓库,以便我们可以对其进行分析 我的目标是将原始列中的varchar值替换/转换为空或-1,或其他一些空占位符 我被告知要创建一个自定义函数来处理这个问题,但我不知道怎么做,我在网上找到的文档在这一点

在SSMS中,我有一个源表和一个目标表。在源表中,有一列通常包含十进制数,但是,当输入值的用户将输入3,14而不是3.14或“未知”等时,该列偶尔会包含文本。(在源表中,技术上允许用户输入他们想要的任何内容。此规则无法更改。)

我有一个存储过程,它从源表中选择一些列,包括有问题的列,并将信息输入数据仓库,以便我们可以对其进行分析

我的目标是将原始列中的varchar值替换/转换为空或-1,或其他一些空占位符

我被告知要创建一个自定义函数来处理这个问题,但我不知道怎么做,我在网上找到的文档在这一点上让我不知所措

以下是表格:

create table SourceTable (
    id INT,
    Column1 DATE,
    Column2 VARCHAR(50)
);
insert into SourceTable (id, Column1, Column2) values (1, '5/8/2017', '533');
insert into SourceTable (id, Column1, Column2) values (2, '10/1/2016', '988');
insert into SourceTable (id, Column1, Column2) values (3, '2/8/2016', '411');
insert into SourceTable (id, Column1, Column2) values (4, '2/29/2016', '491');
insert into SourceTable (id, Column1, Column2) values (5, '3/15/2016', '500');
insert into SourceTable (id, Column1, Column2) values (6, '4/2/2017', '677');
insert into SourceTable (id, Column1, Column2) values (7, '5/4/2016', '56/58');
insert into SourceTable (id, Column1, Column2) values (8, '8/24/2016', 'Unknown');
insert into SourceTable (id, Column1, Column2) values (9, '2/2/2017', '');
insert into SourceTable (id, Column1, Column2) values (10, '1/7/2017', '410');

如何将数字从SourceTable.Column2转换到Destination.Column2(如果可能,最好使用自定义函数)?

您可以使用
try\u cast(Column2作为float)
,如果无法转换为
float
数据类型,它将返回
null

如果要按照建议用占位符值替换
null
,可以使用
isnull()
coalesce()

rextester演示:

返回:

+----+------------+---------+
| id |  column1   | column2 |
+----+------------+---------+
|  1 | 2017-05-08 |     533 |
|  2 | 2016-10-01 |     988 |
|  3 | 2016-02-08 |     411 |
|  4 | 2016-02-29 |     491 |
|  5 | 2016-03-15 |     500 |
|  6 | 2017-04-02 |     677 |
|  7 | 2016-05-04 |      -1 |
|  8 | 2016-08-24 |      -1 |
|  9 | 2017-02-02 |       0 |
| 10 | 2017-01-07 |     410 |
+----+------------+---------+
在Sql Server 2012及更高版本中:当转换失败而不是出现错误时,每个都将返回
null

您可以使用
try\u cast(Column2作为float)
,如果无法将其转换为
float
数据类型,它将返回
null

如果要按照建议用占位符值替换
null
,可以使用
isnull()
coalesce()

rextester演示:

返回:

+----+------------+---------+
| id |  column1   | column2 |
+----+------------+---------+
|  1 | 2017-05-08 |     533 |
|  2 | 2016-10-01 |     988 |
|  3 | 2016-02-08 |     411 |
|  4 | 2016-02-29 |     491 |
|  5 | 2016-03-15 |     500 |
|  6 | 2017-04-02 |     677 |
|  7 | 2016-05-04 |      -1 |
|  8 | 2016-08-24 |      -1 |
|  9 | 2017-02-02 |       0 |
| 10 | 2017-01-07 |     410 |
+----+------------+---------+
在Sql Server 2012及更高版本中:当转换失败而不是出现错误时,每个都将返回
null


在用户输入各种数字类型的情况下,您可能会使用
ISNUMERIC

如果值是数字,则返回1,否则返回0。你应该小心1303。如果你知道用户的意思是1.303,那么你可以使用try cast,但是如果它实际上是1000。。。我不知道你怎么能保证你的假设


在用户输入各种数字类型的情况下,您可能可以使用
ISNUMERIC

如果值是数字,则返回1,否则返回0。你应该小心1303。如果你知道用户的意思是1.303,那么你可以使用try cast,但是如果它实际上是1000。。。我不知道你怎么能保证你的假设


您可以使用try\u convert或case,如下所示

Insert into Destination
select Id, Column1, Case when ISNUMERIC(Replace(column2,',','.')) = 1 then convert(float, Replace(column2,',','.')) else -1 end 
    from SourceTable

您可以使用try\u convert或case,如下所示

Insert into Destination
select Id, Column1, Case when ISNUMERIC(Replace(column2,',','.')) = 1 then convert(float, Replace(column2,',','.')) else -1 end 
    from SourceTable

试试这个

 Create FUNCTION dbo.FindNoneNumeric 
 (@FloatString VARCHAR(8000))
 RETURNS INT
 AS
 BEGIN
    Declare @Status int 
    SET @Status =
       (SELECT CASE 
     WHEN @FloatString NOT LIKE '%[^0-9]%'
     THEN 1
     ELSE 0
     END)

     return @Status 
 END
插入语句

insert into Destination(ID,Column1,Column2)
Select ID,Column1,Column2 from  SourceTable
 where  dbo.FindNoneNumeric(SourceTable.Column2)=1

试试这个

 Create FUNCTION dbo.FindNoneNumeric 
 (@FloatString VARCHAR(8000))
 RETURNS INT
 AS
 BEGIN
    Declare @Status int 
    SET @Status =
       (SELECT CASE 
     WHEN @FloatString NOT LIKE '%[^0-9]%'
     THEN 1
     ELSE 0
     END)

     return @Status 
 END
插入语句

insert into Destination(ID,Column1,Column2)
Select ID,Column1,Column2 from  SourceTable
 where  dbo.FindNoneNumeric(SourceTable.Column2)=1

小心使用
isnumeric()
。它可能不会像你想象的那样这很奇怪,需要一个选项“isnumeric(var,notCrazyMode)”小心使用
isnumeric()
。它可能不会像你想象的那样这很奇怪,需要一个选项“isnumeric(var,notCrazyMode)”小心使用
isnumeric()
。它可能不会像你想象的那样小心使用
isnumeric()
。它可能不会像你想象的那样@john5请检查。@john5请检查。