语法错误:在 select 语句中包含存储过程的结果

Posted

技术标签:

【中文标题】语法错误:在 select 语句中包含存储过程的结果【英文标题】:incorrect syntax : including results of stored procedure in select statement 【发布时间】:2014-10-29 10:23:07 【问题描述】:

我有一个执行此操作的存储过程...

CREATE PROCEDURE spGetRegion @postcode nvarchar(10)
AS 
SELECT capt FROM REGION_DATA
where POSTCODE = @postcode
go

这意味着我可以跑了

exec spGetCounty @postcode = 'rh12'

它返回一个区域,例如“东南”

是否可以在选择语句中包含这样的存储过程的结果。例如

SELECT 
  FIRST_NAME
, LAST_NAME
, POSTCODE
, << NEED TO INCLUDE RESULTS OF STORED PROCEDURE HERE PASSING IN POSTCODE
FROM PEOPLE

类似

SELECT 
  FIRST_NAME
, LAST_NAME
, POSTCODE
, exec spGetCounty @postcode = 'rh12' << THIS BIT DOESN'T WORK !!
FROM PEOPLE

有什么想法吗?

【问题讨论】:

你可以使用表值函数.. 查看***.com/questions/14506871/… 【参考方案1】:

考虑使用标量函数,而不是存储过程:

CREATE FUNCTION spGetRegion (
    @postcode nvarchar(10)
)
RETURNS varchar(255)
BEGIN
    DECLARE @capt varchar(255);

    SELECT @capt = capt
    FROM REGION_DATA
    where POSTCODE = @postcode;

    RETURN(@capt);
END;

那么你可以这样称呼它:

SELECT FIRST_NAME, LAST_NAME, POSTCODE,
       dbo.spGetRegion('rh12');
FROM PEOPLE;

【讨论】:

你提到了returns INT并且你返回了一个varchar @HHH 。 . .谢谢你。 OP 没有指定类型,所以我不确定使用哪个。显然,我在中途改变了主意。【参考方案2】:

你需要创建一个函数

CREATE function spGetRegion 
(
    @postcode nvarchar(10)
)
RETURNS  varchar(100)
as
begin

    SELECT capt FROM REGION_DATA
    where POSTCODE = @postcode

end

并在您的查询中使用它

SELECT 
FIRST_NAME
, LAST_NAME
, POSTCODE
, dbo.spGetCounty('rh12')
FROM PEOPLE

【讨论】:

【参考方案3】:

不,您不能在 select 语句中使用存储过程。

您必须使用用户定义的函数 - 缩放函数

CREATE FUNCTION [dbo].[ufnGetCounty] 
(
     @postcode nvarchar(10)
)
RETURNS VARCHAR(200)
AS
BEGIN
    DECLARE @capt VARCHAR(200)

    SELECT @capt = capt FROM REGION_DATA
    where POSTCODE = @postcode

    RETURN @capt
END

然后你可以像这样在 select 语句中使用它 -

SELECT 
  FIRST_NAME
, LAST_NAME
, POSTCODE
, dbo.ufnGetCounty(postcode)
FROM PEOPLE

【讨论】:

【参考方案4】:

通过参考以下链接使用视图或用户定义的功能

使用视图, http://msdn.microsoft.com/en-us/library/aa258253%28SQL.80%29.aspx

使用用户定义的函数 http://msdn.microsoft.com/en-us/library/aa175085%28SQL.80%29.aspx

一个过程可以返回多个结果集,每个结果集都有自己的架构。它不适合在 SELECT 语句中使用。

或者,试试下面的方法

    SELECT  *  FROM    
    OPENQUERY(YOURSERVERNAME, 'EXEC MyProc @parameters')
    WHERE somefield = anyvalue

【讨论】:

以上是关于语法错误:在 select 语句中包含存储过程的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 select 语句中包含 PERCENTILE_CONT 列,而不会生成有关 ORDER BY 子句或聚合函数的错误?

如何在 Java 中的 Prepared Select 语句中包含参数? [复制]

如何在执行立即语句中包含变量?

有没有办法在嵌套的 WITH 语句中包含 DELETE FROM 语句?

MySQL - View 的 SELECT 在 FROM 子句中包含一个子查询

ERROR 1172 (42000): 结果在 mysql 存储过程中包含多于一行