这是存储过程#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查询时,得到了一个正确的值。请问有甚麽可行的解决办法或类似的例子可以解决这个问题?
发布于 2016-06-13 05:52:50
存储的proc sp2输出选择的结果,但与所有存储的procs一样,它使用return语句返回一个整数。您没有return语句,所以Server为您生成一个语句:return 0。返回代码的目的是给出它是否按预期运行的反馈。按照约定,返回代码为0意味着没有错误。
这显示了返回代码与存储的proc的输出之间的区别。创建一个临时表#output来捕获存储的proc输出的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发布于 2016-06-13 03:46:24
创建一个表变量&按如下方式使用:
create proc test55
as
select 55
declare @test table (Value Varchar(255))
insert into @test
exec test55
Select * from @test 发布于 2016-06-13 04:02:38
您的sp2存储过程将返回表,而不是varchar(255)。
如果您想从varchar(255)获得一个sp2,您应该使用函数。
您可以在我的示例中查看:
定义一个函数:
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]
ENDhttps://stackoverflow.com/questions/37781477
复制相似问题