Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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 将子字符串编号从nvarchar转换为数字_Sql_Sql Server_Casting_Type Conversion_Substring - Fatal编程技术网

Sql 将子字符串编号从nvarchar转换为数字

Sql 将子字符串编号从nvarchar转换为数字,sql,sql-server,casting,type-conversion,substring,Sql,Sql Server,Casting,Type Conversion,Substring,我知道在SQL中将字符串转换为整数有很多问题,但是我还没有得到任何关于子字符串返回值的信息。我使用substring函数只返回字符串中的数字,这样我就可以比较这些值,但是我得到了一个错误 将数据类型nvarchar转换为数字时出错 我已尝试运行以下命令: select sy.ResourceID, sy.ResourceType, sy.Name0, sy.SMS_Unique_Identifier0, sy.Resource_Domain_OR_Workgr0,

我知道在SQL中将字符串转换为整数有很多问题,但是我还没有得到任何关于子字符串返回值的信息。我使用substring函数只返回字符串中的数字,这样我就可以比较这些值,但是我得到了一个错误

将数据类型nvarchar转换为数字时出错

我已尝试运行以下命令:

select 
   sy.ResourceID,
   sy.ResourceType,
   sy.Name0,
   sy.SMS_Unique_Identifier0,
   sy.Resource_Domain_OR_Workgr0,
   sy.Client0,
   Cast(Cast (substring(bio.SMBIOSBIOSVersion0,9,6)as Numeric(4,2)) as Int) as 'BiosVersion'
from v_R_system sy 
   inner join v_GS_FIRMWARE firm on firm.ResourceID = sy.ResourceId 
   inner join v_GS_COMPUTER_SYSTEM CS on cs.ResourceID = sy.ResourceId 
   inner join v_GS_PC_BIOS Bio on bio.ResourceID = sy.ResourceId 
where firm.SecureBoot0 != 1 and cs.Model0 = 'HP EliteBook 840 G3'
Casting as int根据子字符串得到的内容将其四舍五入到
1
,此时它应该是
01.43
。当我删除强制转换为int并转换为numeric时,它会截断它
1.42
。当我尝试将其与我指定的值进行比较时,仍然会得到上面所述的错误

select 
   sy.ResourceID,
   sy.ResourceType,
   sy.Name0,
   sy.SMS_Unique_Identifier0,
   sy.Resource_Domain_OR_Workgr0,
   sy.Client0,
   Cast(substring(bio.SMBIOSBIOSVersion0,9,6)as Numeric(4,2)) as 'BiosVersion'
from v_R_system sy 
   inner join v_GS_FIRMWARE firm on firm.ResourceID = sy.ResourceId 
   inner join v_GS_COMPUTER_SYSTEM CS on cs.ResourceID = sy.ResourceId 
   inner join v_GS_PC_BIOS Bio on bio.ResourceID = sy.ResourceId 
where firm.SecureBoot0 != 1 and cs.Model0 = 'HP EliteBook 840 G3' 
   and Cast(substring(bio.SMBIOSBIOSVersion0,9,6)as Numeric(4,2)) < 01.42
选择
sy.ResourceID,
sy.ResourceType,
sy.0,
sy.SMS_唯一_标识符0,
sy.Resource\u Domain\u或\u Workgr0,
sy.Client0,
将(子字符串(bio.SMBIOSBIOSVersion0,9,6)转换为数字(4,2))转换为“BiosVersion”
来自v_R_系统sy
firm.ResourceID=sy.ResourceID上的内部连接v_GS_固件firm
内部连接在CS.ResourceID=sy.ResourceID上的计算机系统CS
Bio.ResourceID=sy.ResourceID上的内部连接v_GS_PC_BIOS Bio
哪里有firm.SecureBoot0!=1和cs.Model0='HP EliteBook 840 G3'
并将(子字符串(bio.SMBIOSBIOSVersion0,9,6)转换为数字(4,2))<01.42
这实际上是我的比较问题还是我格式化的方式问题

产品:

  • Microsoft SQL Server标准(64位)
  • 版本:2016(v13.0.4604.0)
  • 语言:英语(美国)
  • 排序规则:SQL\u拉丁1\u通用\u CP1\u CI\u AS

简单的修复方法是
尝试cast()
而不是
cast()


简单的修复方法是
try\u cast()
而不是
cast()


作为强制转换的替代方法,您可以通过添加0强制“数值上下文”

select ...
0+substring(bio.SMBIOSBIOSVersion0,9,6) as 'BiosVersion'
这可能取决于您的数据库风格和版本。请具体说明


指定的子字符串可能不是数字。在这种情况下,try_cast将起作用(请参见其他答案)。

作为cast的替代方法,您可以通过添加0强制“数字上下文”

select ...
0+substring(bio.SMBIOSBIOSVersion0,9,6) as 'BiosVersion'
这可能取决于您的数据库风格和版本。请具体说明

指定的子字符串可能不是数字。在这种情况下,try_cast将起作用(参见其他答案)

Casting as int根据子字符串得到的内容将其四舍五入到
1
,此时它应该是
01.43
。当我删除强制转换为int并转换为numeric时,它会截断它
1.42

首先是取整问题。如果精度超过两个数字,则需要转换为包含所有可能数字的数字类型,因为这些数字中的任何一个都可能成为取整方式的分界符。完成该转换后,使用函数获得实际需要的精度

您似乎还关心前导的
0
,至少是
SELECT
子句。我建议不要那样做。让客户端代码担心数字和日期的精确格式。但是如果你真的需要这个,你需要这个函数。同样,在转换为数值后使用此选项,但您可以使用它替换
ROUND()
。重要的是,这会再次生成字符串值,而不是数字值,因此当客户端程序或报表需要字符串数据时,仅将其用于
SELECT
子句

最后,
WHERE
子句中有一种情况,其中包含一些无效的强制转换。这里的问题是,不能强制SQL Server以任何特定顺序运行WHERE子句中的条件。Sql Server将按照其认为最有效的顺序处理这些过滤器,即使出于逻辑原因需要更快地处理一些过滤器

考虑到这一点,您应该考虑在WHERE子句中使用。这将允许您安全地将这些子字符串转换为数值,甚至在其他必要的过滤器完成之前

Casting as int根据子字符串得到的内容将其四舍五入到
1
,此时它应该是
01.43
。当我删除强制转换为int并转换为numeric时,它会截断它
1.42

首先是取整问题。如果精度超过两个数字,则需要转换为包含所有可能数字的数字类型,因为这些数字中的任何一个都可能成为取整方式的分界符。完成该转换后,使用函数获得实际需要的精度

您似乎还关心前导的
0
,至少是
SELECT
子句。我建议不要那样做。让客户端代码担心数字和日期的精确格式。但是如果你真的需要这个,你需要这个函数。同样,在转换为数值后使用此选项,但您可以使用它替换
ROUND()
。重要的是,这会再次生成字符串值,而不是数字值,因此当客户端程序或报表需要字符串数据时,仅将其用于
SELECT
子句

最后,
WHERE
子句中有一种情况,其中包含一些无效的强制转换。这里的问题是,不能强制SQL Server以任何特定顺序运行WHERE子句中的条件。Sql Server将按照其认为最有效的顺序处理这些过滤器,即使出于逻辑原因需要更快地处理一些过滤器


考虑到这一点,您应该考虑在WHERE子句中使用。这将允许您安全地将这些子字符串转换为数值,甚至在其他必要的筛选器完成之前。

您很可能通过
子字符串获得一个前导空格。试着从10点开始,而不是9点。并利用
where
子句将结果集限制为仅符合条件的记录

cast(substring(bio.SMBIOSBIOSVersion0,10,6) as numeric(4,2))

您很可能通过
子字符串
获得前导空格。试着从