7

我有一个返回大量结果的存储过程,并且想要一种比复制/粘贴到 excel 或其他内容更好的调试/解析结果的方法 - 有没有办法将过程的结果传递到查询中?例如,如果过程调用类似于:

exec database..proc 'arg1','arg2','arg3'

我的想法是做类似的事情:

select distinct column1 from 
(exec database..proc 'arg1','arg2','arg3')

这显然不起作用,否则我不会在这里。如果重要的话,这适用于 sybase 数据库。

谢谢!

4

7 回答 7

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
于 2009-02-28T14:22:26.767 回答
3

在 SQL Anywhere 10 和 11 中(不知道您要询问的是 ASA 还是 ASE):

SELECT DISTINCT Column1
FROM procName(parameter1, parameter2, parameter3);

我没有 ASE,我不确定这是否适用于早期的 ASA 版本。

于 2009-03-04T23:29:14.937 回答
1

您可以在 sp 中创建一个临时表 (#temp) 并在其中填充结果集。您可以稍后从同一会话的同一临时表中进行选择。(或者使用 ##temp 语法在 sybase 中使用全局临时表)

这是因为您想要做的(从 exec sp 中选择 *)在 sybase 中无法直接实现

于 2009-02-28T14:04:25.513 回答
1

是否可以将存储过程重写为返回表的函数?在 SQL Server 上,这当然是可能的。然后你可以做...

select
    <any columns you like>
from
    dbo.myFunc( 'foo', 'bar', 1 )
where
    <whatever clauses you like>
order by
    <same>
于 2009-02-28T15:09:13.347 回答
0

我不熟悉 Sybase,但在 MySQL 中,您可以使用该IN参数为所有这些编写一个 SQL 查询。前任:

select distinct column1 from table where column1 in (your_first_query_with_all_the_arguments)

于 2009-02-28T15:25:52.137 回答
0

解决此问题的唯一真正方法是在数据库中创建一个表来存储临时值。

假设存储过程选择 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

我希望这会有所帮助,我之前遇到过类似的问题,这是我能解决的最好的问题。

于 2009-03-02T17:46:28.927 回答
0

我现在没有安装 Sybase,所以这里的一些小的语法方面可能是错误的 - 我无法检查,但我过去广泛使用它:select * into #temp from proc_name('arg1','arg2' ,'arg3') 应该使用正确的列自动为您创建本地临时表。在同一个事务或开始/结束块中,您可以通过select * from #temp 访问#temp。

于 2009-04-22T09:09:17.713 回答