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> 为什么会有警告? 字段列表中的类型转换如何影响基数估计?
我遇到了一个问题,就是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 …
以下查询有效: 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 …
我正在尝试运行一个简单的查询来获取在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');`