Sql 检查存储过程是否只返回一列和一行

Sql 检查存储过程是否只返回一列和一行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在此查询中: DECLARE @TempPerformance TABLE(FeatureTitle VARCHAR(50), FeatureText VARCHAR(50)) INSERT INTO @TempPerformance EXEC [usp_GetPerfomance] @Value 它有时给出2列,有时只给出一列。当它只返回1列时,它不起作用,因为临时表不是这样设计的 如何区分这两种结果 编辑 如果SP出现故障,它将返回一列-一行,如下所示: Standard ------

在此查询中:

DECLARE @TempPerformance TABLE(FeatureTitle VARCHAR(50), FeatureText VARCHAR(50))

INSERT INTO @TempPerformance 
EXEC [usp_GetPerfomance] @Value
它有时给出2列,有时只给出一列。当它只返回1列时,它不起作用,因为临时表不是这样设计的

如何区分这两种结果

编辑

如果SP出现故障,它将返回一列-一行,如下所示:

Standard
--------
No Records Found
您可以使用执行查询并将结果作为表获取。然后,您可以使用该表来验证是否应该以一种方式处理它

如果您转到链接并查看以下部分:

SELECT a.*
FROM OPENROWSET('SQLNCLI', 'Server=Seattle1;Trusted_Connection=yes;',
     'SELECT GroupName, Name, DepartmentID
      FROM AdventureWorks.HumanResources.Department
      ORDER BY GroupName, Name') AS a;
然后可以用EXEC yourDatabase.Schema.Procedure替换SELECT

但是,它要求您向服务器发送临时查询,而您可能没有这样做的适当权限。
对于生产环境来说,它通常不是一种固溶体,所以我个人不推荐这种方法

只有一种方法。使用
OPENROWSET
可以将存储过程的结果放入动态创建(temp)表中。可能存在安全和登录问题

之后,您可以使用
sys.columns

SELECT * INTO #MyTempTable FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;',
        '[usp_GetPerfomance] ' + CAST(@Value AS VARCHAR(MAX)));

SELECT COUNT(*) FROM tempdb.sys.columns WHERE object_id=object_id('tempdb..#MyTempTable');

您需要更改存储过程,以便它生成的每个可能的结果集具有相同的“形状”-相同的列数,这些列的类型相同,理想情况下这些列的名称相同(在大多数情况下,列名比位置更重要,但这是少数不需要列名的情况之一)。usp_GetPerformance的代码是相关的,但您没有提供。因为我无法更改SP…因为存在大量依赖项…所以我觉得它不相关。@Damien_不信者-这里还有其他方法吗..因为我无法更改SP..不幸的是,除非您能从值中告诉自己,否则无法解决此问题返回的结果,可以设置不同的表来保存结果。请参阅:“如果execute_语句与INSERT一起使用,则每个结果集必须与表或列_列表中的列兼容。”