sql-server - 为什么这个 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 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
作为存储过程中的第一个命令。
在您的测试过程中,这显然会起作用;它可能在更改数据的过程中产生不良的副作用。
推荐阅读
- .net - Mono 可以创建静态库(.a 文件)以链接到 Rust 可执行文件吗?
- python - 使用 Python 将文件上传到 Google Drive(如果不存在)
- visual-studio - 试图卸载 Visual Studio。InstallCleanup.exe 不存在并且运行安装不会创建它
- python - 以倒计时间隔跳过python中的迭代
- python - 如何在 groupby 之后将 pandas.core.series.Series 转换回 Dataframe?
- github - 如何阻止 Vercel 预览部署出现在拉取请求中?
- javascript - 我如何获取数据统计值
- c# - 当前上下文中不存在“logonType”
- c# - 在 C# 中计算 ARC 正切的函数
- apache-spark - 使用火花爆炸时删除方括号