Questions tagged «type-conversion»

对于将一种数据类型转换为另一种数据类型的问题,或该过程引起的问题。


1
查询计划“基数估计”中的警告
create table T(ID int identity primary key) insert into T default values insert into T default values go select cast(ID as varchar(10)) as ID from T where ID = 1 上面的查询在查询计划中有一个警告。 <Warnings> <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" /> </Warnings> 为什么会有警告? 字段列表中的类型转换如何影响基数估计?

2
为什么“ SELECT POWER(10.0,38.0);”会引发算术溢出错误?
我正在更新我的IDENTITY溢出检查脚本以解决DECIMAL和NUMERIC IDENTITY列。 作为检查的一部分,我计算了每一IDENTITY列的数据类型范围的大小。我用它来计算该范围已用尽的百分比。对于DECIMAL与NUMERIC 该范围的大小2 * 10^p - 2,其中p是精度。 我用DECIMALand NUMERIC IDENTITY列创建了一堆测试表,并尝试如下计算它们的范围: SELECT POWER(10.0, precision) FROM sys.columns WHERE is_identity = 1 AND type_is_decimal_or_numeric ; 这引发了以下错误: Msg 8115, Level 16, State 6, Line 1 Arithmetic overflow error converting float to data type numeric. 我将其范围缩小到IDENTITY类型的列DECIMAL(38, 0)(即,具有最大精度),因此我POWER()直接尝试对该值进行计算。 以下所有查询 SELECT POWER(10.0, 38.0); SELECT CONVERT(FLOAT, (POWER(10.0, …

2
是否有“自定义数据类型”之类的东西?
MySQL是否支持自定义数据类型?例如,邮政编码可以存储在一个varchar(10)字段中,但可以压缩为一个int,其中带有空白选项,并带有一个有关5位或5 + 4位邮政编码的标志。 有没有办法为这些事情安装无缝数据类型?就应用程序而言,它将是字符串类型,如果应用程序传递了无效数据,则将只是数据截断(带有或不带有警告)。 可以使用自定义函数(例如,有一个INET_ATON用于IPv4地址的内置函数。但这不允许zip LIKE '12345%'进行正确索引的事情。对自定义数据类型的良好书写支持将允许标记数据类型因此,紧凑型zip int在排序时会像是一样进行排序zip varchar(10)。 这将允许该列为固定宽度,这将允许将6或10字节的变量存储空间缩减为4 byby固定宽度。 有几种适用的用途 邮递区号 IPv6地址 自定义时间戳字段,具有分钟级别的精度和容量2038,且存储使用量少于datetime,但无需支持实施年份之前的日期(例如,如果这些日期是系统中最早的日期,则最小值可以是2007年) 实现DST的时间戳(似乎不存在) 两个字母的美国状态可以存储在一个字节中 ENUM可以将long s分隔为自定义数据类型,这样,DESCRIBE在所有包装中,输出都不会显得那么混乱。 我希望数据类型处理程序的存储方式类似于函数的存储方式。 任何数据库引擎上是否都存在类似的远程功能?我主要使用MySQL,但是我很好奇它是否曾经实现过,没有让应用程序调用类似于INET_ATON函数的函数。 MS SQL确实具有这种性质,但是我想知道它是否仅仅是同义词。(例如,boolean可以是tinyint(1)或或或或postal_code之一的同义词)同义词不是我要问的。charvarchar (5910)

3
在T-SQL中使用CAST降低性能
我们有一个SQL生成器,该生成器通常针对指定的字段发出SQL条件语句(为了便于讨论,我们将其标记为myField)。 如果myField类型为NVARCHAR,我们可以将所述字段与字符串进行比较,如下所示:myField = 'foo'。 但是,这不适用于type的字段NTEXT。因此,我们必须使用强制转换进行比较 CAST(myField as NVARCHAR(MAX)) = 'foo'。如果myField类型为NVARCHAR或,则实际上可以使用NTEXT。 在已经是类型的字段上执行上述强制转换会对性能产生什么影响NVARCHAR?我希望SQL Server足够聪明,可以动态地识别myField已经存在的类型NVARCHAR(有效地将其CAST变成无操作)。

3
将逗号作为小数点分隔符的字符串数值转换为NUMERIC(10,2)
我有一个varchar列的SQL表,其中包含希腊格式的数字(。作为千位分隔符,而逗号作为十进制分隔符) 经典转换 CONVERT(numeric(10,2),REPLACE([value],',','.')) 不起作用,因为。(千位分隔符)杀死转换 例如尝试 CONVERT(numeric(10,2),REPLACE('7.000,45',',','.')) 我想将这些值转换为数字(10,2) 关于如何处理的任何建议?

2
为什么我将Int / Smallint隐式转换为Varchar,这真的会影响基数估计吗?
我正在尝试使用实际执行计划上的“显示计划分析”(SSMS)来执行性能缓慢的查询。分析工具指出,行数的估计值与计划中某些位置的返回结果不符,并进一步给了我一些隐式转换警告。 我不理解这些从int到Varchar的隐式转换-引用的字段不是查询中任何参数/过滤器的一部分,并且在涉及的所有表中,列数据类型都是相同的: 我收到以下CardinalityEstimate警告: 表达式中的类型转换(CONVERT_IMPLICIT(varchar(12),[ccd]。[profileid],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我的数据库中到处都是整数 表达式中的类型转换(CONVERT_IMPLICIT(varchar(6),[ccd]。[nodeid],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我数据库中的每个地方都是smallint 表达式中的类型转换(CONVERT_IMPLICIT(varchar(6),[ccd]。[sessionseqnum],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我的数据库中到处都是smallint 表达式中的类型转换(CONVERT_IMPLICIT(varchar(41),[ccd]。[sessionid],0))可能会影响查询计划选择中的“ CardinalityEstimate”-该字段在我的数据库中到处都是小数 [编辑]这是查询和实际执行计划,以供参考 https://www.brentozar.com/pastetheplan/?id=SysYt0NzN 和表定义 /****** Object: Table [dbo].[agentconnectiondetail] Script Date: 1/10/2019 9:10:04 AM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[agentconnectiondetail]( [sessionid] [decimal](18, 0) NOT NULL, [sessionseqnum] [smallint] NOT NULL, [nodeid] [smallint] NOT NULL, [profileid] [int] …

1
使用CEILING时,CASE表达式返回错误的值
我遇到了一个问题,就是CASE表达式无法返回我期望的结果。 作为测试,我添加了一个十进制变量并对它运行相同的CASE表达式,它运行良好,返回的结果与我期望的一样(将值四舍五入IsGun=1。但是当我CASE对另一个十进制值运行相同的表达式时,它总是返回CEILING()函数的值,并且永远不会返回原始值。 这是SQL代码: DECLARE @Num decimal(8,2); set @Num = 12.54; WITH PQ AS ( SELECT UPC, Price1, DBID, AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg FROM vProducts_PriceQty_Union ) SELECT PQ.UPC, PQ.Price1, PQ.Price1Avg, (CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar, CAST( (CASE WHEN P.IsGun = 1 …

2
将日期时间列转换为秒数
在我的SQL Server数据库中,有一datetime列。 创建代表long该datetime列值的新列的好方法是什么?在long将表示了若干秒。 我认为,如果可以将其转换为longs,则可以更轻松地按时间段进行分组查询,因为我可以将长整数除以固定数量。 该表是静态的,不会更新或删除数据。

3
将非Unicode字符串转换为Unicode字符串SSIS
我正在创建一个程序包,将从数据库中将数据导出到一个空的excel文件中。当我仅添加源组件和目标组件并运行程序包时,出现转换错误,指出“输出”列和“ A”列无法在Unicode和非Unicode字符串数据类型之间进行转换。 为了解决这个问题,我添加了一个数据转换组件并将所有列转换为 “ Unicode字符串[DT_WSTR]” 而且我不再收到该错误。唯一的问题是,我有大约50列,其中我必须一比一地从下拉列表中选择“ Unicode字符串[DT_WSTR]”。然后,我不得不进入目标组件并将新转换的列映射到我的excel文件。 我的问题是,如果还有其他人遇到过这种情况,是否有更好的更有效的方法来解决必须进行所有手动数据类型转换的问题?必须逐一转换和映射所有列似乎不切实际,尤其是在您有大量行的情况下。 我了解excel文件不是导入和导出数据的最佳方法,但这是在特定情况下所需要的。 我可能会寻找一种只导出到纯文本文件,然后尝试转换为excel的方法,这是该程序包的最后一步。我希望这不会触发相同的unicode / nonunicode转换错误。

3
PostgreSQL查询中未知的返回类型
以下查询有效: SELECT a, b FROM unnest(ARRAY[(1,2), (3,4)]) AS t(a integer, b integer); a b _ _ 1 2 3 2 但是,我无法使用其他列类型,例如varchar(255): SELECT a, b FROM unnest(ARRAY[(1,'hello'), (3,'world')]) AS t(a integer, b varchar(255)); ERROR: 42804: function return row and query-specified return row do not match DETAIL: Returned type unkown at ordinal …

5
将varchar数据类型转换为datetime数据类型导致超出范围的值
我正在尝试运行一个简单的查询来获取在11月创建的所有行: SELECT COUNT(*) FROM dbo.profile WHERE [Created] BETWEEN '2014-11-01 00:00:00.000' AND '2014-11-30 23:59:59.997'; SMSS返回: 从varchar数据类型到datetime数据类型的转换导致值超出范围。 我不明白为什么将“ Created”设置为datetime时将数据从varchar转换为datetime: 我需要告诉服务器“创建”是日期时间吗?如果没有,为什么我会收到此varchar消息? 编辑:数据库中的值为YYYY-MM-DD。下面来自@SqlZim的回复说,我需要使用convert()告诉sql数据库中的日期是什么格式-并将空格字符替换为字母T: select count(*) from dbo.profile where [created] between convert(datetime,'2014-11-01T00:00:00.000') and convert(datetime,'2014-11-30T23:59:59.997');`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.