Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 尝试解析,但要更快_Sql Server_Sql Server 2012_Data Conversion - Fatal编程技术网

Sql server 尝试解析,但要更快

Sql server 尝试解析,但要更快,sql-server,sql-server-2012,data-conversion,Sql Server,Sql Server 2012,Data Conversion,将大量近100个nvarchar列转换为浮点的最快方法是什么 目前,我有一堆TRY_PARSEcolumn-name作为FLOAT语句,每列一条 如果列未解析为float,则我希望为NULL。没有错误通知,没有额外的智能 有没有更快的办法?如果是,会是什么 SQL Server 2012只是一个简短的测试,以显示TRY\u PARSE和TRY\u CAST之间的性能差异 我的成绩 试一试327毫秒 试着用17784毫秒 这意味着,TRY_CAST大约比TRY_PARSE快50倍。顺便说一句:TR

将大量近100个nvarchar列转换为浮点的最快方法是什么

目前,我有一堆TRY_PARSEcolumn-name作为FLOAT语句,每列一条

如果列未解析为float,则我希望为NULL。没有错误通知,没有额外的智能

有没有更快的办法?如果是,会是什么


SQL Server 2012

只是一个简短的测试,以显示TRY\u PARSE和TRY\u CAST之间的性能差异

我的成绩

试一试327毫秒 试着用17784毫秒 这意味着,TRY_CAST大约比TRY_PARSE快50倍。顺便说一句:TRY_CONVERT的性能几乎与TRY_CAST相同

尝试一下并发布你的结果-

SET LANGUAGE ENGLISH;

DECLARE @tbl TABLE(SomeFloatAsString VARCHAR(100),fl2 VARCHAR(100),fl3 VARCHAR(100),fl4 VARCHAR(100),fl5 VARCHAR(100),fl6 VARCHAR(100),fl7 VARCHAR(100),fl8 VARCHAR(100),fl9 VARCHAR(100),fl10 VARCHAR(100));
DECLARE @i INT=0;
WHILE @i<100000
BEGIN
    INSERT INTO @tbl VALUES(RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND());
    SET @i+=1;
END

DECLARE @d DATETIME2 = SYSUTCDATETIME();

SELECT TRY_CAST(SomeFloatAsString AS FLOAT) fl1
      ,TRY_CAST(fl2 AS FLOAT) fl2
      ,TRY_CAST(fl3 AS FLOAT) fl3
      ,TRY_CAST(fl4 AS FLOAT) fl4
      ,TRY_CAST(fl5 AS FLOAT) fl5
      ,TRY_CAST(fl6 AS FLOAT) fl6
      ,TRY_CAST(fl7 AS FLOAT) fl7
      ,TRY_CAST(fl8 AS FLOAT) fl8
      ,TRY_CAST(fl9 AS FLOAT) fl9
      ,TRY_CAST(fl10 AS FLOAT)fl10
INTO #tmp1
FROM @tbl

SELECT DATEDIFF(MILLISECOND,@d,SYSUTCDATETIME())


DECLARE @d2 DATETIME2 = SYSUTCDATETIME();

SELECT TRY_PARSE(SomeFloatAsString AS FLOAT) fl1
      ,TRY_PARSE(fl2 AS FLOAT) fl2 
      ,TRY_PARSE(fl3 AS FLOAT) fl3
      ,TRY_PARSE(fl4 AS FLOAT) fl4
      ,TRY_PARSE(fl5 AS FLOAT) fl5
      ,TRY_PARSE(fl6 AS FLOAT) fl6
      ,TRY_PARSE(fl7 AS FLOAT) fl7
      ,TRY_PARSE(fl8 AS FLOAT) fl8
      ,TRY_PARSE(fl9 AS FLOAT) fl9
      ,TRY_PARSE(fl10 AS FLOAT)fl10
INTO #tmp2
FROM @tbl

SELECT DATEDIFF(MILLISECOND,@d2,SYSUTCDATETIME());

只是一个简短的测试,以显示TRY_PARSE和TRY_CAST之间的性能差异

我的成绩

试一试327毫秒 试着用17784毫秒 这意味着,TRY_CAST大约比TRY_PARSE快50倍。顺便说一句:TRY_CONVERT的性能几乎与TRY_CAST相同

尝试一下并发布你的结果-

SET LANGUAGE ENGLISH;

DECLARE @tbl TABLE(SomeFloatAsString VARCHAR(100),fl2 VARCHAR(100),fl3 VARCHAR(100),fl4 VARCHAR(100),fl5 VARCHAR(100),fl6 VARCHAR(100),fl7 VARCHAR(100),fl8 VARCHAR(100),fl9 VARCHAR(100),fl10 VARCHAR(100));
DECLARE @i INT=0;
WHILE @i<100000
BEGIN
    INSERT INTO @tbl VALUES(RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND(),RAND());
    SET @i+=1;
END

DECLARE @d DATETIME2 = SYSUTCDATETIME();

SELECT TRY_CAST(SomeFloatAsString AS FLOAT) fl1
      ,TRY_CAST(fl2 AS FLOAT) fl2
      ,TRY_CAST(fl3 AS FLOAT) fl3
      ,TRY_CAST(fl4 AS FLOAT) fl4
      ,TRY_CAST(fl5 AS FLOAT) fl5
      ,TRY_CAST(fl6 AS FLOAT) fl6
      ,TRY_CAST(fl7 AS FLOAT) fl7
      ,TRY_CAST(fl8 AS FLOAT) fl8
      ,TRY_CAST(fl9 AS FLOAT) fl9
      ,TRY_CAST(fl10 AS FLOAT)fl10
INTO #tmp1
FROM @tbl

SELECT DATEDIFF(MILLISECOND,@d,SYSUTCDATETIME())


DECLARE @d2 DATETIME2 = SYSUTCDATETIME();

SELECT TRY_PARSE(SomeFloatAsString AS FLOAT) fl1
      ,TRY_PARSE(fl2 AS FLOAT) fl2 
      ,TRY_PARSE(fl3 AS FLOAT) fl3
      ,TRY_PARSE(fl4 AS FLOAT) fl4
      ,TRY_PARSE(fl5 AS FLOAT) fl5
      ,TRY_PARSE(fl6 AS FLOAT) fl6
      ,TRY_PARSE(fl7 AS FLOAT) fl7
      ,TRY_PARSE(fl8 AS FLOAT) fl8
      ,TRY_PARSE(fl9 AS FLOAT) fl9
      ,TRY_PARSE(fl10 AS FLOAT)fl10
INTO #tmp2
FROM @tbl

SELECT DATEDIFF(MILLISECOND,@d2,SYSUTCDATETIME());

Shnugo评论说TRY_CAST应该更快,所以我想还有什么比测试更好的方法,从快速测试中我确实同意

首先,创建一些数据的简短设置:

USE Sandbox;
GO

DECLARE @SQL nvarchar(MAX);
CREATE TABLE TallyTable (I int);
WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1
         CROSS JOIN N N2
         CROSS JOIN N N3)
INSERT INTO dbo.TallyTable (I)
SELECT I
FROM Tally;

SELECT @SQL =
       N'CREATE TABLE SampleTable (' + 
       STUFF((SELECT TOP 100
                     N',' + NCHAR(10) + 
                     N'    ' + QUOTENAME(CONCAT(N'Col',T.I)) + N' varchar(10)'
              FROM TallyTable T
              FOR XML PATH(N'')),1,1,N'') + NCHAR(10) + N');';
EXEC sp_executesql @SQL;
SELECT @SQL =
      N'INSERT INTO SampleTable' + NCHAR(10) + 
      N'VALUES(' + STUFF((SELECT TOP 100 ',0'
                          FROM TallyTable T
                          FOR XML PATH(N'')),1,1,N'') + N');';

EXEC sp_executesql @SQL;
GO
这将创建一个值为0的包含100列的表。现在,如果我们尝试\u CAST和\u PARSE:

上述结果微不足道,但仍表明:

TRY_PARSE

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 4 ms.
TRY_CAST

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
这是一个4ms的不同,一行100列。让我们增大音量,然后运行此操作需要一段时间:

DECLARE @SQL nvarchar(MAX);
SELECT @SQL =
      N'INSERT INTO SampleTable' + NCHAR(10) + 
      N'VALUES' +STUFF((SELECT N',' + NCHAR(10) +
      N'       (' + STUFF((SELECT TOP 100 ',0'
                                              FROM TallyTable T
                                              FOR XML PATH(N'')),1,1,N'') + N')'
                        FROM TallyTable T
                        FOR XML PATH(N'')),1,1,N'') + N';';

SELECT @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
--Now we have 5001 rows
现在我们有5001行和100列。现在,如果我们再运行上面的程序

TRY_PARSE

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(5001 rows affected)

 SQL Server Execution Times:
   CPU time = 14672 ms,  elapsed time = 18690 ms.
TRY_CAST

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(5001 rows affected)

 SQL Server Execution Times:
   CPU time = 125 ms,  elapsed time = 671 ms.
相差18019ms的惊人速度是18秒,或者说快了近28倍

所以,答案是,使用TRY\u CAST或TRY\u CONVERT,我相信这会很快

--cleanup
DROP TABLE dbo.TallyTable;
DROP TABLE SampleTable;

Shnugo评论说TRY_CAST应该更快,所以我想还有什么比测试更好的方法,从快速测试中我确实同意

首先,创建一些数据的简短设置:

USE Sandbox;
GO

DECLARE @SQL nvarchar(MAX);
CREATE TABLE TallyTable (I int);
WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1
         CROSS JOIN N N2
         CROSS JOIN N N3)
INSERT INTO dbo.TallyTable (I)
SELECT I
FROM Tally;

SELECT @SQL =
       N'CREATE TABLE SampleTable (' + 
       STUFF((SELECT TOP 100
                     N',' + NCHAR(10) + 
                     N'    ' + QUOTENAME(CONCAT(N'Col',T.I)) + N' varchar(10)'
              FROM TallyTable T
              FOR XML PATH(N'')),1,1,N'') + NCHAR(10) + N');';
EXEC sp_executesql @SQL;
SELECT @SQL =
      N'INSERT INTO SampleTable' + NCHAR(10) + 
      N'VALUES(' + STUFF((SELECT TOP 100 ',0'
                          FROM TallyTable T
                          FOR XML PATH(N'')),1,1,N'') + N');';

EXEC sp_executesql @SQL;
GO
这将创建一个值为0的包含100列的表。现在,如果我们尝试\u CAST和\u PARSE:

上述结果微不足道,但仍表明:

TRY_PARSE

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 4 ms.
TRY_CAST

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(1 row affected)

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.
这是一个4ms的不同,一行100列。让我们增大音量,然后运行此操作需要一段时间:

DECLARE @SQL nvarchar(MAX);
SELECT @SQL =
      N'INSERT INTO SampleTable' + NCHAR(10) + 
      N'VALUES' +STUFF((SELECT N',' + NCHAR(10) +
      N'       (' + STUFF((SELECT TOP 100 ',0'
                                              FROM TallyTable T
                                              FOR XML PATH(N'')),1,1,N'') + N')'
                        FROM TallyTable T
                        FOR XML PATH(N'')),1,1,N'') + N';';

SELECT @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
EXEC sp_executesql @SQL;
--Now we have 5001 rows
现在我们有5001行和100列。现在,如果我们再运行上面的程序

TRY_PARSE

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(5001 rows affected)

 SQL Server Execution Times:
   CPU time = 14672 ms,  elapsed time = 18690 ms.
TRY_CAST

 SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.

(5001 rows affected)

 SQL Server Execution Times:
   CPU time = 125 ms,  elapsed time = 671 ms.
相差18019ms的惊人速度是18秒,或者说快了近28倍

所以,答案是,使用TRY\u CAST或TRY\u CONVERT,我相信这会很快

--cleanup
DROP TABLE dbo.TallyTable;
DROP TABLE SampleTable;

不幸的是,一般的答案是,在用户需要使用特定区域性解析字段的情况下,TRY_PARSE不能被TRY_CAST或TRY_CONVERT替代


如果您正在进行简单、直接的转换,如“。。。作为INT,然后使用TRY\u CAST或TRY\u CONVERT。如果需要使用区域性进行翻译,则必须坚持使用TRY_PARSE。

不幸的是,一般的答案是,如果用户需要使用特定区域性解析字段,TRY_PARSE不能替换为TRY_CAST或TRY_CONVERT


如果您正在进行简单、直接的转换,如“。。。作为INT,然后使用TRY\u CAST或TRY\u CONVERT。如果您需要具有区域性的翻译,则必须坚持使用TRY\u PARSE。

我怀疑列数是否会成为问题,而是行数。您可以编写自己的TRY\u PARSE版本,但速度会较慢。这一过程是否真的很慢,或者您正在进行过早的优化?另外,使用FLOAT时要小心,因为它不是一个精确的数据类型。TRY\u CAST应该更快…@Shnugo为什么这样认为?我对10000个字符串进行了快速测试try\u cast vs try\u parse,执行计划完全相同。@Shnugo根据此链接try\u cast和try\u convert的性能将优于try\u parse。但是,try\u转换没有一致的模式。我怀疑列的数量会是问题所在,这将是行的数量。您可以编写自己版本的try\u PARSE,但速度会较慢。这一过程是否真的很慢,或者您正在进行过早的优化?另外,使用FLOAT时要小心,因为它不是一个精确的数据类型。TRY\u CAST应该更快…@Shnugo为什么这样认为?我对10000个字符串进行了快速测试try\u cast vs try\u parse,执行计划完全相同。@Shnugo根据此链接try\u cast和try\u convert的性能将优于try\u parse。但是,没有一致的try_转换模式,在try_转换中,我测试了10列,10万行,速度快了50倍-是的,看起来TRY_PARSE scales@Shnugo:我测试了10列,10万行,速度快了50倍-是的,看起来像是试试看@Shnugo:50K的成绩。我错过了重要的一天。@johncapelletti-Thx,你就快到了-我更像一个尝试改变的女孩。。。就您的示例而言,try\u convert始终优于try\u cast。我无法提供任何理由:@JohnCappelletti,只是di
我自己进行了测试,得到了17200个TRY_PARSE,313个TRY_CONVERT和282个TRY_CAST。我认为,cast和convert大致相同,而parse则相去甚远……@PiotrL快50倍将是7x50=350秒~5.8分钟-恭喜你赢了50K。我错过了重要的一天。@johncapelletti-Thx,你就快到了-我更像一个尝试改变的女孩。。。就您的示例而言,try\u convert始终优于try\u cast。我无法解释原因:@JohnCappelletti,刚刚自己做了测试,得到了17200个TRY_解析,313个TRY_转换和282个TRY_转换。我认为,cast和convert大致相同,而parse则相去甚远……@PiotrL快50倍将是7x50=350秒~5.8分钟-