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一起使用,则每个结果集必须与表或列_列表中的列兼容。”