Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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 server SQL Server错误的查询结果。也许是索引?_Sql Server - Fatal编程技术网

Sql server SQL Server错误的查询结果。也许是索引?

Sql server SQL Server错误的查询结果。也许是索引?,sql-server,Sql Server,我有一个有趣的问题。我有以下非常简单的存储过程,它在过去三个月内一直正常运行: ALTER PROCEDURE [dbo].[GetResults] @WorkID VARCHAR(15), @Years VARCHAR(3) AS BEGIN SET NOCOUNT ON; SELECT [EmployeeID], [WorkID], [Years] FROM [Table].[Schema].[Results]

我有一个有趣的问题。我有以下非常简单的存储过程,它在过去三个月内一直正常运行:

ALTER PROCEDURE [dbo].[GetResults]
    @WorkID VARCHAR(15), 
    @Years VARCHAR(3)
AS
BEGIN
    SET NOCOUNT ON;

    SELECT 
        [EmployeeID], [WorkID], [Years]
    FROM 
        [Table].[Schema].[Results]
    WHERE
        Years = @Years AND WorkID = @WorkID
    ORDER BY 
        Years DESC
END
周六,它开始说,当我让一个web应用程序点击这个存储过程时,没有结果

但是,当我在SSMS中运行此过程时,我会得到正确的结果。当我将此代码复制并粘贴到另一个选项卡(SSMS内部)并运行它时,我会得到正确的结果

我一直在与前端开发人员合作,所以我们一直在对事情进行评论,我们确定只要我们没有条件
WorkID=@WorkID
,我们就会得到结果。如果我们允许这个条件,结果几乎总是返回0个结果。我们发现,如果重新启动服务器或运行alter procedure命令,web应用程序有时会返回一次正确的结果,但如果重新查询,则返回的结果将为0

我们假设参数
@WorkID
被错误地传递,但是查看日志,很明显它是正确的;此外,我可以进入代码并硬编码一个我知道有结果的WorkID,它仍然返回0个结果

例如:

SELECT 
    [EmployeeID], [WorkID], [Years]
FROM 
    [Table].[Schema].[Results]
WHERE
    Years = '1' AND WorkID = 'SomeKnownWorkID'
再一次,如果我们通过SSMS运行它,一切正常,只要我们通过web应用程序调用它,它就会返回0个结果。我最终禁用了一个非唯一聚集索引(如下所示),一切似乎都重新开始工作

CREATE NONCLUSTERED INDEX [NonClusteredIndex-WorkID] 
    ON [schema].[Results] ([WorkID] ASC, [Years] ASC)
       WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,  
             SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
             ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

我不认为这会引起问题。有什么建议吗?我从来没有见过这样的情况。

如果权限相同并且都在同一数据库的上下文中运行,那么从SSMS和应用程序运行查询应该没有什么区别。在达到超时值之前,查询是否运行缓慢?SSMS和.NET(或大多数其他客户端LIB)默认情况下不使用相同的设置,这意味着您可能会达到超时值。不幸的是(或者幸运的是,根据您的观点),禁用索引会强制生成新的执行计划,这意味着您可能已经消除了(可能的)优化器错误的任何证据。不过,首先要做的是:确定web应用程序没有明确使用
readuncommitted
事务隔离级别;否则,所有赌注都将被取消。您确定两者都在同一个数据库上运行吗?看来我之前调用了一个过程,导致了问题。一旦我们将事务隔离级别设置为Read COMMITED,一切都会被清除。这应该是默认值,为什么会更改?有什么想法吗?谢谢@Jeroen Mostert请将此作为答案提交,以便我们将其标记为未来参考的答案。谢谢大家!Read committed是默认的事务隔离级别。大多数情况下(除非是只读数据库),readuncommitted会导致各种难以理解的问题。当我说SQL Server是可靠的时,我假设您至少在读提交中。如果您驾驶时车门全开,双腿坐在仪表板上,则任何车辆都是不安全的。如果权限相同,并且两者都在同一数据库的上下文中运行,则从SSMS和应用程序运行查询应该没有什么区别。在达到超时值之前,查询是否运行缓慢?SSMS和.NET(或大多数其他客户端LIB)默认情况下不使用相同的设置,这意味着您可能会达到超时值。不幸的是(或者幸运的是,根据您的观点),禁用索引会强制生成新的执行计划,这意味着您可能已经消除了(可能的)优化器错误的任何证据。不过,首先要做的是:确定web应用程序没有明确使用
readuncommitted
事务隔离级别;否则,所有赌注都将被取消。您确定两者都在同一个数据库上运行吗?看来我之前调用了一个过程,导致了问题。一旦我们将事务隔离级别设置为Read COMMITED,一切都会被清除。这应该是默认值,为什么会更改?有什么想法吗?谢谢@Jeroen Mostert请将此作为答案提交,以便我们将其标记为未来参考的答案。谢谢大家!Read committed是默认的事务隔离级别。大多数情况下(除非是只读数据库),readuncommitted会导致各种难以理解的问题。当我说SQL Server是可靠的时,我假设您至少在读提交中。如果你开着车门,双腿坐在仪表板上,任何汽车都是不安全的。