SQL Server日期时间变量返回空值

SQL Server日期时间变量返回空值,sql,sql-server,Sql,Sql Server,我有以下代码: DECLARE @DispDateTime datetime SELECT @DispDateTime = table1.U_dispDate + convert(datetime, right('0'+convert(varchar, table1.U_dispTime/100),2)+':'+right('0'+convert(varchar,table1.U_dispTime % 100 ),2),120) from table1 select table1.cal

我有以下代码:

DECLARE @DispDateTime datetime

SELECT @DispDateTime = table1.U_dispDate + convert(datetime, right('0'+convert(varchar, table1.U_dispTime/100),2)+':'+right('0'+convert(varchar,table1.U_dispTime % 100 ),2),120) 
from table1

select  table1.callID, 
        @DispDateTime, 
        table1.U_dispDate + convert(datetime, right('0'+convert(varchar, table1.U_dispTime/100),2)+':'+right('0'+convert(varchar,table1.U_dispTime % 100 ),2),120)
from table1
您可以看到select语句中的值与变量声明中的值完全相同。然而,我的结果是这样的:

callID  DispDate Variable   DispDate Calc
13      NULL                2016-04-04 07:07:00.000
15      NULL                2016-04-04 09:11:00.000
16      NULL                2016-04-04 07:10:00.000
19      NULL                2016-04-04 08:27:00.000
21      NULL                2016-04-04 07:39:00.000
23      NULL                2016-04-04 07:06:00.000
24      NULL                2016-04-04 10:20:00.000
25      NULL                2016-04-04 09:23:00.000
我一辈子都搞不明白为什么会发生这种事。我98%肯定这是件简单的事,我其实是个白痴,但这是我在几天内第二次碰到这个问题。(就内存而言,这也是我第一次不得不使用Datetime变量,所以它很可能是我不知道的东西)

编辑:

A) 将时间存储为nvarchar的原因是,这是由系统指定的(如果有必要,请选择SAP Business One)。这不是我能改变的


B) 我认为我真正想做的是使用CTE,这将解决我的问题。我想我只是忘记了变量是如何工作的或是什么(即不是按行设置的,而是设置一次然后运行)


谢谢大家的帮助

可能您的变量有多个结果
@DispDateTime

您需要
@DispDateTime
的唯一结果

例如:

SELECT TOP 1 @DispDateTime = table1.U_dispDate + ...

或者where子句

可能您的变量有多个结果
@DispDateTime

您需要
@DispDateTime
的唯一结果

例如:

SELECT TOP 1 @DispDateTime = table1.U_dispDate + ...

或者where子句

最好的选择是首先停止将日期存储为varchar。另一件需要注意的事情是,您没有指定varchar的长度。这意味着它使用默认值,可以根据上下文进行更改。最好始终指定长度。正如张贴的那样,这似乎不是一个问题。您能否发布一些可以重新创建此问题的示例数据,以便我们可以帮助您解决此问题?什么是
SELECT@DispDateTime=…
?您需要(可以)在
@DispDateTime
中只选择一个值,并且您正在尝试写入整个列:)尝试使用
TOP 1
或确定此变量的一个有效值。验证选择表1.U\U dispDate,convert(datetime,right('0'+convert(varchar,table 1.U\dispTime/100),2)+:'+right('0'+convert(varchar,table 1.U\dispTime%100),2),120)从表1中选择表1。。。。。。。它对任何列都返回NULL吗?我想我忘了变量是如何工作的。在客户现场工作了一个月。。。大脑开始燃烧。我认为解决办法就是使用CTE。谢谢大家的帮助@SeanLange,请参见上文我的编辑A)了解为什么这不是一个可行的选项。(简而言之,SAP Business One将时间存储为varchar,如果您更改它,系统将崩溃并可能停止工作)绝对最好的选择是首先停止将日期存储为varchar。另一件需要注意的事情是,您没有指定varchar的长度。这意味着它使用默认值,可以根据上下文进行更改。最好始终指定长度。正如张贴的那样,这似乎不是一个问题。您能否发布一些可以重新创建此问题的示例数据,以便我们可以帮助您解决此问题?什么是
SELECT@DispDateTime=…
?您需要(可以)在
@DispDateTime
中只选择一个值,并且您正在尝试写入整个列:)尝试使用
TOP 1
或确定此变量的一个有效值。验证选择表1.U\U dispDate,convert(datetime,right('0'+convert(varchar,table 1.U\dispTime/100),2)+:'+right('0'+convert(varchar,table 1.U\dispTime%100),2),120)从表1中选择表1。。。。。。。它对任何列都返回NULL吗?我想我忘了变量是如何工作的。在客户现场工作了一个月。。。大脑开始燃烧。我认为解决办法就是使用CTE。谢谢大家的帮助@SeanLange,请参见上文我的编辑A)了解为什么这不是一个可行的选项。(简而言之,SAP Business One将时间存储为varchars,如果您更改它,系统将崩溃并可能停止工作)他有多个结果-第二个查询使用同一个表并返回许多行她有多个结果-第二个查询使用同一个表并返回许多行