Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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内部联接在SP中从字符串转换日期和/或时间获取错误消息_Sql_Sql Server_Tsql - Fatal编程技术网

SQL内部联接在SP中从字符串转换日期和/或时间获取错误消息

SQL内部联接在SP中从字符串转换日期和/或时间获取错误消息,sql,sql-server,tsql,Sql,Sql Server,Tsql,我已经搜索了大约20个结果,显示错误消息“从字符串转换日期和/或时间时转换失败”。但似乎没有一个结果能够解决我的问题 有一点历史,上周五查询工作正常,返回的数据正确。在接下来的星期一,查询不再工作,并给出了错误消息“从字符串转换日期和/或时间时转换失败”。因此,经过几个小时的斗争后,它能够运行一个包含错误代码的函数,查询再次完美运行。直到今天早上。我走进办公室,运行查询,收到错误“从字符串转换日期和/或时间时转换失败”。因此,现在我要大发雷霆了 我首先使用isDate函数验证返回的每个记录实际上

我已经搜索了大约20个结果,显示错误消息“从字符串转换日期和/或时间时转换失败”。但似乎没有一个结果能够解决我的问题

有一点历史,上周五查询工作正常,返回的数据正确。在接下来的星期一,查询不再工作,并给出了错误消息“从字符串转换日期和/或时间时转换失败”。因此,经过几个小时的斗争后,它能够运行一个包含错误代码的函数,查询再次完美运行。直到今天早上。我走进办公室,运行查询,收到错误“从字符串转换日期和/或时间时转换失败”。因此,现在我要大发雷霆了

我首先使用isDate函数验证返回的每个记录实际上都是有效日期。所有日期都是字符串格式的有效日期。我只是做一个检查,看看记录是否超过1年

我确实有几个内部连接,一直在想它们是否会影响输出

SELECT 
gc2p.partnumber, gc2p.orderby, gc2p.campaigncode, gp2a.assetfilename
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2productrefs] gc2p
,[StepMirror].[dbo].[stepview_nwppck_ngn_getpimweblegalattrlist1] gpwa
,[StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a 
,[StepMirror].[dbo].[stepview_nwppck_ngn_getproduct2assetrefs] gp2a 
WHERE gc2p.partnumber=gpwa.PARTNUMBER and
gc2p.id=gc2a.id and
gp2a.PRODUCTNAME=gpwa.PARTNUMBER and
ATTRIBUTENAME='New Date' AND 
ATTRIBUTEVALUE > dateadd(month,-12,getdate()) AND 
gc2p.id = '5665976' and 
gc2a.assettype='Primary Image' AND 
gp2a.ASSETTYPE = 'Primary Image'
order by gc2p.orderby
如果有人能帮我一把,那就太好了

编辑:当我删除'ATTRIBUTEVALUE>dateadd(month,-12,getdate())'时,查询运行良好。我忘了提到引发错误的查询的确切部分

编辑:已更新查询-正在为寻求类似答案的人提供查询

SELECT TOP 18 gc2p.partnumber, gpwa.ATTRIBUTECNAME,gp2a.ASSETFILENAME, gpwa.ATTRIBUTEVALUE
FROM [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2productrefs] gc2p
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getpimweblegalattrlist1] gpwa ON gc2p.partnumber=gpwa.PARTNUMBER and gpwa.ORDERBY='96'
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getclassification2assetrefs] gc2a ON gc2p.id=gc2a.id
INNER JOIN [StepMirror].[dbo].[stepview_nwppck_ngn_getproduct2assetrefs] gp2a ON gc2p.partnumber=gp2a.PRODUCTNAME
WHERE gc2p.id = 5665976 AND gp2a.assettype='Primary Image' AND gc2a.assettype='Primary Image' 
AND(CASE WHEN ISDATE(ATTRIBUTEVALUE)  = 0 then NULL ELSE ATTRIBUTEVALUE END) > dateadd(month,-12,getdate())
order by gc2p.orderby

不管是什么,请确保您的查询与此无关。所有这些都是关于表中的数据。正如我看到的查询一样,似乎您正在加入一些视图,并且在视图定义中可能有一些转换导致了此错误。如果我找到了,我会对表进行一些简单的查询,并将字符串列逐个转换为datetime,直到找到错误引用

希望能有帮助


干杯

问题可能是您的ATTRIBUTEVALUE字段中有非日期数据。您假设包含
ATTRIBUTENAME='New Date'
将对其进行过滤,但这可能不取决于查询计划。试试看

(CASE WHEN ISDATE(ATTRIBUTEVALUE) = 0 then NULL ELSE ATTRIBUTEVALUE END) > dateadd(month,-12,getdate()) AND ...
在复杂联接中,SQL引擎可能会决定先联接表,然后使用筛选器,这将导致不匹配,因为并非每个
ATTRIBUTEVALUE
实例都会隐式转换为日期


另外,请使用真正的SQL连接,而不是逗号连接。它的格式不好,造成的问题比解决的问题多得多。

你的约会是什么格式的?您的执行用户设置为什么语言?如果您想测试:
ATTRIBUTEVALUE
“列的数据类型是什么?”是唯一支持作为日期的数据类型,这可能会有所帮助?。哦,作为一个好的实践,您应该将隐式连接更改为显式连接。连接可能会导致您意想不到的元组。如果在没有where的情况下运行联接,是否存在ATTRIBUTEVALUE为null的元组?即使要联接的源表中没有空值,也会发生这种情况。这就是EAV模式糟糕的原因。@HeatherRoberts如果要将多个属性存储在同一列中,那么在报告时强制它们都是
datetime
,似乎有点违反直觉,没有?这些是没有关系的平桌。我没有访问任何视图。查询很好,返回了正确的数据,但查询中没有包含'ATTRIBUTEVALUE>dateadd(month,-12,getdate())。因此,您似乎已经知道了问题所在!ATTRIBUTEVALUE列的内容是什么?在一个简单的Select语句中进行一个简单的转换(datetime,ATTRIBUTEVALUE),然后看看会发生什么。您认为呢?ATTRIBUTEVALUE可以保存多种类型的数据,而不仅仅是日期。运行简单的select会因为其他数据而导致错误。哇,我明白了。因此,您应该在转换之前对值进行一些验证。我建议操作员找出该值是否为datetime。然后进行转换。我从case语句中得到一条“不正确的语法(')””错误消息。我的绝地sql技能不足。这不仅可能,而且考虑到这一点,“ATTRIBUTEVALUE是nvarchar(1700),可以存储任何类型的数据(零件号、描述文本、日期等)。语言是英语。”@数据您是说我执行联接的方式可能会导致在联接之前选择表,从而在将ATTRIBUTEVALUE验证为日期时引发错误?@HeatherRoberts他是说您在一列中存储多个不同的“真实”数据类型,并且在测试日期时,它将所有这些记录都拉入它要过滤的集合。因此,它试图将零件号转换为日期,除非将零件号格式化为日期,否则这可能是不可能的。这个解决方案测试某物是否是日期,以及它是否试图将其格式化为日期。@HeatherRoberts我修正了他的语法,它缺少
案例的
结尾。尝试更新的代码。