我有一个返回大量结果的存储过程,并希望有一种更好的方法来调试/解析结果,而不是复制/粘贴到excel或其他任何东西 - 有没有办法将过程的结果传递给查询?例如,如果程序调用类似于:
exec database..proc 'arg1','arg2','arg3'
我的想法是做类似的事情:
select distinct column1 from
(exec database..proc 'arg1','arg2','arg3')
显然不起作用,或者我不会在这里。如果重要,那就是sybase数据库。
谢谢!
答案 0 :(得分:3)
以下代码适用于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
答案 1 :(得分:3)
在SQL Anywhere 10和11中(没有看到它是ASA还是ASE你要问的问题):
SELECT DISTINCT Column1
FROM procName(parameter1, parameter2, parameter3);
我没有ASE,我不确定这是否适用于早期的ASA版本。
答案 2 :(得分:1)
你可以在sp中创建一个临时表(#temp)并在那里填充结果集。您可以稍后从同一会话中选择相同的临时表。 (或者在sybase中使用## temp语法的全局临时表)
这是因为你想要做的事情(select * from exec sp)在sybase中是不可能的
答案 3 :(得分:1)
是否可以将存储过程重写为返回表的函数?在SQL Server上,这当然是可能的。那你可以做......
select
<any columns you like>
from
dbo.myFunc( 'foo', 'bar', 1 )
where
<whatever clauses you like>
order by
<same>
答案 4 :(得分:0)
我不熟悉Sybase,但在MySQL中,您可以使用IN
参数为所有这些编写一个SQL查询。例如:
select distinct column1 from table where column1 in (your_first_query_with_all_the_arguments)
答案 5 :(得分:0)
解决此问题的唯一方法是在数据库中创建一个表来存储临时值。
让我们说存储过程选择Column1,Column2&amp;栏3。
使用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 :(得分:0)
我现在没有安装Sybase,所以这里有一些小的语法方面可能是错误的 - 我无法检查,但我过去广泛使用它:选择 * 进入 #temp 来自 proc_name('arg1','arg2','arg3')应该使用正确的列自动为您创建本地临时表。在同一个交易或开始/结束块中,您可以通过选择 * 从 #temp访问#temp。