【问题标题】:Procedure calling other procedure in t-sql在 t-sql 中调用其他过程的过程
【发布时间】:2013-04-29 20:39:20
【问题描述】:

我在 SQL Server 2008 中有这个 T-SQL 过程:

create procedure rolledback  as 
begin
  set nocount on ;

  declare @min int
  declare @max int
  declare @I INT

  IF OBJECT_ID ('TEMDB..#TempTable') IS NOT  NULL
    begin 
      drop table #TempTable
  end 
  create table #TempTable
       ( TempOrderNumber int  )
  SELECT @min = ( SELECT MIN (numero)                           
               from controlanum  with (nolock))

  SELECT @max =  ( SELECT Max (numero)                           
               from controlanum  with (nolock))   

select @I = @min 

while @I <= @max
    begin
          insert into #TempTable 
          select  @I 
          select  @I = @I + 1               
    end            
  select tempordernumber from #TempTable               
  left join controlanum O  with (nolock) 
  on TempOrderNumber = o.numero  where o.numero is null                              
 end        

这与视图控件完美配合,但我需要选择日期间隔

我已经写了另外两个程序来过滤这段时间

 create proc maxiN (@emp int, @mes int, @ano int)
 as
     select Max (numero)
     from ctrc 
     WHERE (EMITENTE = @emp) 
     AND (MONTH(EMISSAODATA) = @mes) AND (YEAR(EMISSAODATA) = @ano)

 create proc Minix (@emp int, @mes int, @ano int)
 as
    select Min (numero)
    from ctrc 
    WHERE (EMITENTE = @emp) 
    AND (MONTH(EMISSAODATA) = @mes) AND (YEAR(EMISSAODATA) = @ano)

我已经在rolledback 过程中插入了这些过程,但是现在rollback2 返回0 出现问题,就像max 和min 的过程返回任何东西一样。

create procedure rolledback2 ( @emp int, @mes int, @ano int) as 
begin
    set nocount on ;

    declare @min int
    declare @max int
    declare @I INT


     IF OBJECT_ID ('TEMDB..#TempTable') IS NOT  NULL
        begin 
             drop table #TempTable
        end 
     create table #TempTable
       ( TempOrderNumber int  )
     exec @min = min2 @emp,@mes ,@ano

     exec @min = min2 @emp,@mes ,@ano   

   select @I = @min 

  while @I <= @max
        begin
             insert into #TempTable 
             select  @I 
             select  @I = @I + 1               
        end            
  select tempordernumber from #TempTable               
  left join controlanum O  with (nolock) 
   on TempOrderNumber = o.numero  where o.numero is null                              
  end        

and with function 不返回任何东西

  declare @min int
  select @min = fmin 504,2,2013

只能这样工作

fmin 504,2,2013

感谢任何方向

亚历杭德罗

【问题讨论】:

    标签: sql-server sql-server-2008 tsql stored-procedures


    【解决方案1】:

    您不能 SELECT 存储过程中的数据 - 您必须将结果数据放入(临时)表中才能获取它。您可能希望将它们创建为函数,因为它们只是 SELECTing 数据,然后您可以内联使用它们。

    CREATE FUNCTION maxiN
    (
        @emp int,
        @mes int,
        @ano int
    )
    RETURNS int
    AS
    BEGIN
        DECLARE @Result INT;
    
        select @Result = Max (numero)
                         from ctrc
                         WHERE (EMITENTE = @emp) 
                               AND (MONTH(EMISSAODATA) = @mes)
                               AND (YEAR(EMISSAODATA) = @ano);
    
        RETURN @Result;
    END
    GO
    

    然后在您的存储过程中使用它们:

    SELECT @max = maxIN(@emp, @mes ,@ano)
    

    【讨论】:

      【解决方案2】:

      就像 zimdanen 所说,一个函数非常适合这个。但是,如果你真的想使用存储过程,你可以使用输出参数,并在你的 Minix 和 maxiN 存储过程中设置它。然后,当你执行 proc 时引用它们。

      create proc myproc
        @b varchar(50) output
      as
      begin
        select  @b='hello'
      end
      go
      declare  @j varchar(50)
      exec myproc @j output
      

      查看更多信息:How to return the output of stored procedure into a variable in sql server

      【讨论】:

        【解决方案3】:

        这可能对你有帮助 -

        CREATE PROCEDURE dbo.rolledback
        AS BEGIN
        
            SET NOCOUNT ON;
        
            DECLARE 
                  @max INT
                , @min INT
        
            DECLARE @TempTable TABLE 
            (
                TempOrderNumber INT
            )
        
            SELECT 
                  @min = MIN(numero) 
                , @max =  MAX(numero)  
            FROM dbo.controlanum WITH(NOLOCK)
        
            INSERT INTO @TempTable (TempOrderNumber)
            SELECT d.num
            FROM (
                SELECT num = @min + ROW_NUMBER() OVER (ORDER BY sv.number) 
                FROM [master].dbo.spt_values sv
                LEFT JOIN [master].dbo.spt_values sv2 ON @max > 2048 AND sv2.[type] = 'P' AND sv2.number < 5
                WHERE sv.[type] = 'P'
            ) d
            WHERE num <= @max 
        
            SELECT TempOrderNumber 
            FROM @TempTable               
            LEFT JOIN controlanum o WITH(NOLOCK) ON TempOrderNumber = o.numero  
            WHERE o.numero IS NULL  
        
        END   
        

        回答你的问题:

        CREATE PROC dbo.maxiN 
        (
              @emp INT
            , @mes INT
            , @ano INT
        )
        AS BEGIN
        
            DECLARE @result INT
        
            SELECT @result = MAX(numero)
            FROM ctrc 
            WHERE EMITENTE = @emp 
                AND MONTH(EMISSAODATA) = @mes 
                AND YEAR(EMISSAODATA) = @ano
        
            RETURN @result
        
        END
        

        执行:

        EXEC @max = dbo.maxiN @emp2, @mes2, @ano2  
        

        【讨论】:

          猜你喜欢
          • 2020-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-03
          • 1970-01-01
          • 2018-10-03
          相关资源
          最近更新 更多