首页 > 解决方案 > 为什么这个 SQL 返回两个结果集?

问题描述

这个测试代码代表我在我的数据库中的 som 代码,但是当我使用 LinqToSql 时,它说存储的 proc 正在返回两个结果集......

CREATE PROCEDURE [dbo].[Test] 
    @a UNIQUEIDENTIFIER,
    @b UNIQUEIDENTIFIER,
    @c UNIQUEIDENTIFIER
AS
BEGIN
    SET NOCOUNT ON;

    IF @c IS NULL
    BEGIN
        SELECT        DISTINCT p1, p2
        FROM          dbo.Test
        WHERE         (a=@a) AND 
                      (b=@b) AND 
                      (c IS NULL)       
    END
    ELSE
    BEGIN
        SELECT        DISTINCT p1, p2
        FROM          dbo.Test
        WHERE         (c=@c)
    END        
END
GO

我以为上面的代码只会返回一个结果集?我可以强制它返回一个结果集吗?

标签: sql-servertsqllinq-to-sql

解决方案


尽管在较新版本的 SQL Server 中存在更好的替代方案,但出于向后兼容性的原因,许多 ORM 和连接库使用不推荐使用的SET FMTONLY命令来发现 Transact-SQL 批处理返回的结果集的形状。

的副作用之一SET FMTONLY是它忽略所有条件逻辑并执行所有逻辑分支。在您的代码中,这将返回两个结果集。如果你运行,你可以自己看到这个:

SET FMTONLY ON;
EXEC  [dbo].[Test] NULL,NULL,NULL
SET FMTONLY OFF;

根据您所看到的,LinqToSQL 似乎正在使用这种方法。

您有时可以通过添加以下内容来解决此问题:

IF 1=0
  SET FMTONLY OFF

作为存储过程中的第一个命令。

在您的测试过程中,这显然会起作用;它可能在更改数据的过程中产生不良的副作用。


推荐阅读