查询存储过程的结果
Posted
技术标签:
【中文标题】查询存储过程的结果【英文标题】:Querying results of a stored procedure 【发布时间】:2010-10-10 12:40:17 【问题描述】:我有一个返回大量结果的存储过程,并且想要一种比复制/粘贴到 excel 或其他内容更好的方法来调试/解析结果 - 有没有办法将过程的结果传递到询问?例如,如果过程调用类似于:
exec database..proc 'arg1','arg2','arg3'
我的想法是做类似的事情:
select distinct column1 from
(exec database..proc 'arg1','arg2','arg3')
这显然不起作用,否则我不会在这里。如果重要的话,这适用于 sybase 数据库。
谢谢!
【问题讨论】:
【参考方案1】:您可以在 sp 中创建一个临时表 (#temp) 并在其中填充结果集。您可以稍后从同一会话的同一临时表中进行选择。 (或者使用 ##temp 语法在 sybase 中使用全局临时表)
这是因为你想要做的事情(从 exec sp 中选择 *)在 sybase 中无法直接实现
【讨论】:
【参考方案2】:下面的代码在 MS SQL 2005 中工作。我现在没有安装 Sybase 来测试它。如果它在 Sybase 中工作,您可以在存储过程之外使用临时表(或永久表),这样您就不必更改要测试的代码(通常不是一个很好的测试过程。)
CREATE TABLE dbo.Test_Proc_Results_To_Table
(
my_id INT NOT NULL,
my_string VARCHAR(20) NOT NULL
)
GO
CREATE PROCEDURE dbo.Test_Proc_Results_To_Table_Proc
AS
BEGIN
SELECT
1 AS my_id,
'one' AS my_string
END
GO
INSERT INTO dbo.Test_Proc_Results_To_Table (my_id, my_string)
EXEC dbo.Test_Proc_Results_To_Table_Proc
GO
SELECT * FROM dbo.Test_Proc_Results_To_Table
GO
【讨论】:
【参考方案3】:是否可以将存储过程重写为返回表的函数?在 SQL Server 上,这当然是可能的。那你就可以...
select
<any columns you like>
from
dbo.myFunc( 'foo', 'bar', 1 )
where
<whatever clauses you like>
order by
<same>
【讨论】:
【参考方案4】:我不熟悉 Sybase,但在 mysql 中,您可以使用 IN
参数为所有这些编写一个 SQL 查询。例如:
select distinct column1 from table where column1 in (your_first_query_with_all_the_arguments)
【讨论】:
【参考方案5】:解决此问题的唯一真正方法是在您的数据库中创建一个表来存储临时值。
假设存储过程选择 Column1、Column2 和 Column3。
拥有一个包含 Column1、Column2、Column3 的表 (tempTable),并将您的存储过程设置为以下内容:
CREATE PROCEDURE database..proc
AS
BEGIN
DELETE FROM tempTable
INSERT INTO tempTable (Column1, Column2, Column3)
SELECT Column1, Column2, Column3
FROM Table1
END
then for your sql code to select the values have:
exec database..proc
SELECT Column1, Column2, Column3
FROM tempTable
我希望这会有所帮助,我以前遇到过类似的问题,这是我能解决的最好的问题。
【讨论】:
【参考方案6】:在 SQL Anywhere 10 和 11 中(不知道你问的是 ASA 还是 ASE):
SELECT DISTINCT Column1
FROM procName(parameter1, parameter2, parameter3);
我没有 ASE,我不确定这是否适用于早期的 ASA 版本。
【讨论】:
【参考方案7】:我现在没有安装 Sybase,所以这里的一些小的语法方面可能是错误的 - 我无法检查,但我过去广泛使用过它:select * into #temp from proc_name('arg1','arg2','arg3') 应该使用正确的列自动为您创建本地临时表。在同一事务或开始/结束块中,您可以通过 select * from #temp 访问#temp。
【讨论】:
以上是关于查询存储过程的结果的主要内容,如果未能解决你的问题,请参考以下文章
在另一个具有动态查询的存储过程中使用具有动态查询的存储过程的结果