2009-11-09 81 views
0

我正在使用SQL 2000.我有一个存储过程,spGetApplicantList,它不能被修改。我需要获取该存储过程中所有记录的唯一LastNameInitials,因此申请人列表可以按字母顺序排序。从storedproc调用结果集

基本上我需要的是

SELECT DISTINCT LEFT(LastName, 1) as [LastNameInitial] 
FROM spGetApplicantList 
ORDER BY LastnameFirstInitial 

如何创建一个新的存储过程,spGetLastNameInitial,通过使用从spGetApplicantList返回的记录?

我似乎无法得到正确的语法。

回答

1

您必须执行第一个sproc spGetApplicantList到临时表中,然后查询该表。不幸的是,你不能在SELECT语句中内联调用存储过程。

-- Create temp table, with the schema matching the results of spGetApplicantList 
CREATE TABLE #TempResults 
(
LastName VARCHAR(50) 
) 

INSERT #TempResults 
EXECUTE spGetApplicantList 

Select DISTINCT LEFT(LastName, 1) as [LastNameInitial] from #TempResults Order by LastnameFirstInitial 

DROP TABLE #TempResults 

另一种方法,就是你从原来的存储过程复制SELECT,但只是做了DISTINCT,而不是返回整个结果集 - 这将节省您不必将所有的数据加载到一个临时表。

+0

我想你的代码,却得到了一个“服务器:消息213,级别16,状态7,过程spGetApplicantList,线371 插入错误:列名或号码提供的值与表定义不匹配。“ – DotNetRookie 2009-11-09 13:30:01

+1

您需要确保#TempResults表的定义与spGetApplicantList返回的列完全相同。因为我不知道哪些列/数据类型的sproc返回,我只是给出了一个基本的例子,假设它只返回一个类型为VARCHAR(50) – AdaTheDev 2009-11-09 13:44:21

+0

类型的“LastName”列所以我猜它不可能只插入LastName列临时表?我必须镜像临时表以反映spGetApplicantList中的列? – DotNetRookie 2009-11-09 14:02:49

0

这是从这个链接: Calling SP from SP

  • 如何使用从一个存储过程的结果在另一个?
  • 只要存储过程只产生一个结果,在另一个存储过程中使用输出的技术就非常简单。该技术是使用临时表来保存存储过程的结果,并使用INSERT EXEC语句来执行存储过程并保存结果。一旦结果在临时表中,它们可以像任何其他表数据一样使用。下面是我们可能想重新使用的示例:

    CREATE PROC usp_Demo_AllAuthors作为

    select * from pubs..authors 
    

    GO

    现在,这里是一个使用usp_Demo_AllAuthors的结果的存储过程:

    CREATE PROC usp_Demo_SPUser as

    CREATE TABLE #Authors (
    au_id varchar(11) NOT NULL PRIMARY KEY CLUSTERED, 
    au_lname varchar (40) NOT NULL , 
    au_fname varchar (20) NOT NULL , 
    phone char (12) NOT NULL, 
    address varchar (40) NULL , 
    city varchar (20) NULL , 
    state char (2) NULL , 
    zip char (5) NULL , 
    contract bit NOT NULL 
    ) 
    
    -- Execute usp_Demo_AllAuthors storing the 
    -- results in #Authors 
    insert into #Authors 
    exec usp_Demo_AllAuthors 
    
    -- Here we use the #Authors table. This example only 
    -- only selects from the temp table but you could do much 
    -- more such as use a cursor on the table or join with 
    -- other data. 
    SELECT au_fName + ' ' + au_lname as [name] 
        , address+', '+city+', '+state+' '+zip [Addr] 
        from #Authors 
    
    DROP TABLE #Authors 
    

    GO

    -Andrew诺维克时,SQL Server专家