这是存储过程#1:
ALTER PROCEDURE [dbo].[sp1]
AS
BEGIN
DECLARE @test varchar(255)
exec @test = dbo.sp2
SET NOCOUNT ON;
SELECT
CMS_ORG.description, @test
FROM
CMS_ORG
END
这是存储过程#2:
ALTER PROCEDURE [dbo].[sp2]
AS
BEGIN
SET NOCOUNT ON;
SELECT
CMS_MAS.description + '' + CONVERT(varchar(50),
CAST(CMS_ORG.amount AS money), 1)
FROM
CMS_ORG
INNER JOIN
CMS_MAS = CMS_ORG.GUID = CMS_MAS.GUID
END
问题在于我无法通过调用存储过程#2在存储过程#1中执行@test
。当我执行sp1时,我得到了一个空值,但是当我在sp1中执行sp2的查询时,我得到了一个正确的值。我可以知道可以解决问题的可能解决方案或类似示例是什么?
答案 0 :(得分:2)
您的存储过程sp2
输出 SELECT的结果,但与所有存储过程一样,使用return
语句返回一个整数。您没有return
语句,因此Sql Server会为您生成一个语句:return 0
。返回代码的目的是提供有关它是否按预期运行的反馈。按照惯例,返回码为0表示没有错误。
这显示了返回代码与存储过程输出之间的差异。创建临时表#output
以捕获存储过程输出的SELECT
行。
DECLARE @return_code int
-- capture the output of the stored proc sp2 in a temp table
create table #output( column_data varchar(max) )
insert #output( column_data )
exec @return_code = dbo.sp2 -- returns 0 because you have no RETURN statement
-- extract column_data from #output into variable @test
-- if there is more than one row in #output, it will take the last one
DECLARE @test varchar(255)
select @test = column_data from #output
答案 1 :(得分:0)
创建表变量&像这样使用它:
create proc test55
as
select 55
declare @test table (Value Varchar(255))
insert into @test
exec test55
Select * from @test
答案 2 :(得分:0)
您的sp2存储过程将返回表,而不是varchar(255)
。
如果你想从sp2获得varchar(255)
,你应该使用函数。
您可以在我的示例中查看:
定义一个函数:
CREATE FUNCTION dbo.function1()
RETURNS varchar(255)
WITH EXECUTE AS CALLER
AS
BEGIN
DECLARE @returnVal varchar(255);
SET @returnVal = (SELECT top 1 [ProductName]
FROM [dbo].[Products])
RETURN(@returnVal);
END;
像这样改变SP1:
ALTER PROCEDURE [dbo].[sp1]
@SMonth As Integer,
@SYear As Integer
AS
BEGIN
DECLARE @test varchar(255)
set @test = dbo.function1()
SET NOCOUNT ON;
SELECT [ProductId], @test
FROM [LearningKO].[dbo].[Products]
END