Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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字段上与LEFT一起使用的强制转换为int不能正常工作?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 在nvarchar字段上与LEFT一起使用的强制转换为int不能正常工作?

Sql 在nvarchar字段上与LEFT一起使用的强制转换为int不能正常工作?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在尝试创建一个视图,其中我合并了4个表。其中一个字段是文档编号。从其中一个表中提取相关文档编号的唯一方法是在最左边的6个字符上运行一个LEFT。但当我这样做,然后转换为整数,我仍然无法查询字段。这就像它正在越过我的where子句,试图转换字段中的所有字符 这就是我正在做的: SELECT dbo.OSLP.U_RepStatus AS RepStatus, dbo.OSLP.SlpCode, dbo.OPCH.CardCode, dbo.OPCH.CardName, 'IN' AS

我正在尝试创建一个视图,其中我合并了4个表。其中一个字段是文档编号。从其中一个表中提取相关文档编号的唯一方法是在最左边的6个字符上运行一个LEFT。但当我这样做,然后转换为整数,我仍然无法查询字段。这就像它正在越过我的where子句,试图转换字段中的所有字符

这就是我正在做的:

SELECT     dbo.OSLP.U_RepStatus AS RepStatus, dbo.OSLP.SlpCode, dbo.OPCH.CardCode, dbo.OPCH.CardName, 'IN' AS DocTypeDesc, dbo.OPCH.DocNum, 
                      dbo.OPCH.DocEntry, dbo.OPCH.DocDate, dbo.OPCH.NumAtCard, dbo.OPCH.DocStatus, dbo.OPCH.DocTotal, dbo.OPCH.U_CommInvNo AS ARInvNo
FROM         dbo.OPCH INNER JOIN
                      dbo.OCRD ON dbo.OPCH.CardCode = dbo.OCRD.CardCode INNER JOIN
                      dbo.OSLP ON dbo.OCRD.U_SalesRepNumber = dbo.OSLP.SlpCode
WHERE     (dbo.OSLP.U_RepStatus IN ('Dir', 'Ind', 'Sal')) AND (dbo.OPCH.U_CommInvNo IS NOT NULL)
UNION
SELECT     OSLP_1.U_RepStatus AS RepStatus, OSLP_1.SlpCode, dbo.ORPC.CardCode, dbo.ORPC.CardName, 'CM' AS DocTypeDesc, dbo.ORPC.DocNum, dbo.ORPC.DocEntry, 
                      dbo.ORPC.DocDate, dbo.ORPC.NumAtCard, dbo.ORPC.DocStatus, - 1 * dbo.ORPC.DocTotal AS DocTotal, dbo.ORPC.U_CommInvNo AS ARInvNo
FROM         dbo.ORPC INNER JOIN
                      dbo.OCRD AS OCRD_1 ON dbo.ORPC.CardCode = OCRD_1.CardCode INNER JOIN
                      dbo.OSLP AS OSLP_1 ON OCRD_1.U_SalesRepNumber = OSLP_1.SlpCode
WHERE     (OSLP_1.U_RepStatus IN ('Dir', 'Ind', 'Sal')) AND (dbo.ORPC.U_CommInvNo IS NOT NULL)
UNION
SELECT     T3.U_RepStatus AS RepStatus, T3.SlpCode, T0.ContraAct AS CardCode, T2.CardName, 'JE' AS DocTypeDesc, T1.TransId AS DocNum, T1.TransId AS DocEntry, 
                      T1.RefDate AS DocDate, T0.LineMemo AS NumAtCard, T1.BtfStatus AS DocStatus, T0.Debit AS DocTotal, CAST(LEFT(T0.LineMemo, 6) AS INT) AS ARInvNo
FROM         dbo.JDT1 AS T0 INNER JOIN
                      dbo.OJDT AS T1 ON T0.TransId = T1.TransId INNER JOIN
                      dbo.OCRD AS T2 ON T0.ContraAct = T2.CardCode INNER JOIN
                      dbo.OSLP AS T3 ON T2.U_SalesRepNumber = T3.SlpCode
WHERE     (T0.ShortName = 'CompanyName') AND (T1.TransType = 30) AND (T0.Account = '_SYS00000000624') AND (T3.U_RepStatus IN ('Dir', 'Ind', 'Sal')) AND (T0.Debit > 0)
UNION
SELECT     T7.U_RepStatus AS RepStatus, T7.SlpCode, T4.ContraAct AS CardCode, T6.CardName, 'JE' AS DocTypeDesc, T5.TransId AS DocNum, T5.TransId AS DocEntry, 
                      T5.RefDate AS DocDate, T4.LineMemo AS NumAtCard, T5.BtfStatus AS DocStatus, - (1 * T4.Credit) AS DocTotal, CAST(LEFT(T4.LineMemo, 6) AS INT) AS ARInvNo
FROM         dbo.JDT1 AS T4 INNER JOIN
                      dbo.OJDT AS T5 ON T4.TransId = T5.TransId INNER JOIN
                      dbo.OCRD AS T6 ON T4.ContraAct = T6.CardCode INNER JOIN
                      dbo.OSLP AS T7 ON T6.U_SalesRepNumber = T7.SlpCode
WHERE     (T4.ShortName = 'CompanyName') AND (T5.TransType = 30) AND (T4.Account = '_SYS00000000624') AND (T7.U_RepStatus IN ('Dir', 'Ind', 'Sal')) AND (T4.Credit > 0)
如果查询此视图时使用ARInvNo=295696,则会出现以下错误: Msg 245,16级,状态1,第1行 将nvarchar值“A/P In”转换为数据类型int时,转换失败


如果我从视图中取出底部的2个联合,我可以查询其中的ARInvNo=295696,而不会出现问题。如果我运行查询的第二个2部分,结果中没有任何内容包含“A/P in”,尽管在我使用的WHERE条件之外的JDT1行中确实存在“A/P in”。你知道为什么SQL在返回任何数据之前会越过我的WHERE语句并试图离开并强制转换每个字段吗

澄清一下,这不会返回任何结果:

SELECT T0.LineMemo 
FROM JDT1 T0  INNER JOIN OJDT T1 ON T0.TransId = T1.TransId INNER JOIN OCRD T2 ON T0.ContraAct = T2.CardCode INNER JOIN OSLP T3 ON T2.U_SalesRepNumber = T3.SlpCode 
WHERE T0.ShortName = 'CompanyName' AND T1.TransType = 30 AND T0.Account = '_SYS00000000624' AND T3.U_RepStatus IN ('Dir', 'Ind', 'Sal') AND left(T0.LineMemo,3)='A/P In'
我现在看到了

它在你的价值观中看到了“A/p”。它无法将“/”字符强制转换为INT

简而言之,您需要执行以下操作:


当isnumericTO.LineMemo=1时选择case,然后将castTO.LineMemo设置为int end

我不确定是否遵循。我将强制转换为INT,因为dbo.OPCH.U_CommInvNo字段已经是INT。如果我取出下半部分,我可以查询其中的ARInvNo=295696。我需要它能够在没有引号的情况下发生,因为原始的docnum数据类型是整数。我将其用于crystal报表,并且我需要能够将ARInvNo链接到另一个表中的DocNum字段,该表是一个整数。如果我去掉CAST并尝试此操作,我会得到相同的错误:其中T10.ARInvNo='295696'try CONVERT-CONVERT data_type[length],expression[,style],这也不起作用。这就是你的意思吗?ConvertINT,left4.LineMemo,6,因为ARInvNoJust看到了您的答案。我试试看。但奇怪的是,“A/P In”不在值中,除非它在读取WHERE之前读取要转换的整个表。我的WHERE子句去掉了任何留下6个非数字值的LineMemo。你知道为什么SQL在返回任何数据之前会越过我的WHERE语句,试图留下并强制转换每个字段吗?因为它认为这样会得到更快的结果。不能保证视图中的WHERE子句在应用于视图的WHERE子句之前得到评估。在执行时,Optimizer将根据整个SQL查询(由视图和使用视图的外部查询组成)制定查询计划。由于这种策略,许多使用视图的SQL代码最终运行得更快。