2010-05-09 72 views
18

我有兴趣从某些事件中返回SQL Server存储过程的空结果集。如何从使用T-SQL的过程中返回空的结果集?

预期的行为是L2SQL DataContext.SPName().SingleOrDefault()将导致CLR空值。

我目前使用下面的解决方案,但我不能确定它是否会被认为是不好的做法,业绩风险(我无法通过读取执行计划找到一个),或者如果有一个简单的更好的方法:

SELECT * FROM [dbo].[TableName] 
WHERE 0 = 1; 

执行计划是一个恒定的扫描与一个微不足道的成本相关联。

我问这个问题而不是简单地不运行任何SELECT的原因是因为我担心之前的SELECT @scalar或SELECT INTO语句可能会导致意外的结果集返回给L2SQL。我担心什么都没有?

+1

看起来对我很好 - 但请确保你留下评论解释它:) – 2010-05-09 01:53:18

回答

10

如果您只想检索结果集的元数据而不包含任何实际行,请使用SET FMTONLY ON

22

这是一个合理的方法。另一种选择是:

SELECT TOP 0 * FROM [dbo].[TableName] 
+0

啊,从来没有想到这一点! – pauloya 2011-01-11 14:00:34

+1

使用SELECT TOP 0 0缩短它(第二个空值是返回的值,但是当您执行top 0时,它不执行任何操作,也不需要访问表。 – KimvdLinde 2017-09-08 16:53:01

2

这是一个完全合理的方法。

为了减轻对性能的任何担忧(首先不应该有任何问题 - 服务器的智能足以避免表格扫描1 = 0),请选择一个非常小且不常用的表格 - 确保你的数据库模式有一个。

26

如果您在响应中需要列名,则从该表继续执行select TOP 0,否则使用SELECT TOP 0 NULL。它应该工作得很快:)

0

我认为最好的解决方案是top 0,但不使用虚拟表。 这是为我做的

select top 0 null as column1,null as column2。

使用例如系统表可能适合性能,但看起来不干净。

相关问题