Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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
使用WHERE子句在视图中定位特定记录时获取SQL Server错误_Sql_Sql Server - Fatal编程技术网

使用WHERE子句在视图中定位特定记录时获取SQL Server错误

使用WHERE子句在视图中定位特定记录时获取SQL Server错误,sql,sql-server,Sql,Sql Server,我试图理解SQL Server查询中出现的错误。澄清一下,这是针对视图而不是表的查询 我可以做到这一点,并得到没有错误的结果: SELECT TOP 1000 [AcctId] ,[DocumentAmount] FROM [LDB].[dbo].[LG_vw_Report_AccountsReceivable] 我看到返回的第一条记录的AcctId为809327 所以,我假设我可以瞄准那一行,并且没有错误。所以我试着这样做: SELECT TOP 1 [AcctId]

我试图理解SQL Server查询中出现的错误。澄清一下,这是针对视图而不是表的查询

我可以做到这一点,并得到没有错误的结果:

SELECT TOP 1000 [AcctId]
      ,[DocumentAmount]
  FROM [LDB].[dbo].[LG_vw_Report_AccountsReceivable]
我看到返回的第一条记录的AcctId为809327

所以,我假设我可以瞄准那一行,并且没有错误。所以我试着这样做:

SELECT TOP 1 [AcctId]
      ,[DocumentAmount]
  FROM [LDB].[dbo].[LG_vw_Report_AccountsReceivable]
  WHERE AcctId = 809327
但这就产生了这个错误:

将varchar值“00000 DELETE”转换为时,转换失败 数据类型int

这个错误告诉了我什么?正如我提到的,我可以看到有问题的行,数据看起来正常。那么,为什么在使用WHERE子句进行查询时无法获得特定的记录呢?这里发生了什么导致了这个错误

更新:这也会失败:

SELECT TOP 1 [AcctId]
      ,[DocumentAmount]
  FROM [LDB].[dbo].[LG_vw_Report_AccountsReceivable]
  WHERE AcctId = '809327'
这也是:

SELECT TOP 1 [AcctId]
      ,[DocumentAmount]
  FROM [LDB].[dbo].[LG_vw_Report_AccountsReceivable]
  WHERE TRY_CONVERT(int, AcctId) = 809327
答复:

AcctId列是varchar列,因此此错误的一个可能原因是AcctId列中的值根据T-SQL中的值隐式转换为整数。您可以尝试以下方法:

SELECT TOP 1 [AcctId], [DocumentAmount]
FROM [RKDB].[dbo].[LG_vw_Report_AccountsReceivable]
WHERE AcctId = '809327'
更新:

当然,这一声明也很重要。从下面的示例中可以看到,第一条语句返回一个错误:

SELECT x + y
FROM (VALUES (1, '1'), (2, '000DELETE')) v (x, y)
WHERE x = 2
但下一个正确执行:

SELECT x + y
FROM (VALUES (1, '1'), (2, '000DELETE')) v (x, y)
WHERE x = 1

视图中可能有问题。然而,真正的可能性是AcctId是一个字符串。要处理这个问题,我建议

  WHERE AcctId = '809327'
您也可以使用零填充。如果是这种情况,则需要在比较中包括:

  WHERE AcctId = '000809327'
你也可以这样做:

  WHERE TRY_CONVERT(int, AcctId) = 809327

但是,这不会使用索引。

列[AcctId]的数据类型是什么?您是否可以检查生成视图的初始数据?这个视图有索引吗?问题似乎出在初始数据上。但如何才能从视图中无误地获取前1000条记录?@Ademo在添加WHERE子句时,如果执行筛选的字段包含在任何索引中,则可能会导致重新构建索引。如果查询时没有位置,则不会重新构建clause@elvira.genkel... 为了澄清这一点,我相信在值中的某个地方实际上有一个值带有DELETE,因为在其他地方我看到了带有此类子句的SELECT语句:并且LM101.DOCNUMBR不像“%DELETE%”尝试了这一点,但它不起作用。作为一些附加信息,这是一个视图,而不是一个表,当生成AcctId时,它将被转换为INT。@Ademo。正如我在第一句中所说的,这个问题可能在我们看来。在这种情况下,您需要修复视图。它坏了。但是如果视图坏了,我怎么能得到前1000条记录呢?只是试着去理解。另外,为了澄清,我相信在值中的某个地方实际上有一个带DELETE的值,因为在其他地方我看到带有此类子句的SELECT语句:和LM101.DOCNUMBR不同于“%DELETE%”@Ademo您可以得到前1000个,因为问题记录不在前1000个中。@Ademo您的视图和模式被破坏了。如果无法修复模式,则需要有人修复视图以正确补偿模式问题。你不能依靠运气来解决这个问题。并停止假设行在表、视图或结果集中具有任何特定顺序。TOP 1000之所以有效,是因为您让引擎选择要包含在结果集中的行,而幸运的是它选择了不会导致问题的行。尝试了此操作,但产生了相同的错误。澄清一下,这是一个VEW,而不是一个表,当AcctId被生成时,我相信它被转换为INT。