之前的帖子(SQL Server自定义函数的问题),可能是没有描述好,解决的方法绕过了问题的关键,在此将问题给的更有针对性些,望大家帮忙
IF EXISTS (SELECT name from sysobjects where name='proc_1' AND type='FN')
  DROP FUNCTION proc_1
GOCREATE FUNCTION proc_1
(@STATTYPE numeric(5),
 @VARTABLE varchar(30),
 @VARKBP numeric(5),
 @VARKPI_NO numeric(5),
 @VARYYYYMMDD1 varchar(20),
 @VARYYYYMMDD2 varchar(20)
 )
RETURNS numeric(13) AS  
BEGIN
declare @result numeric(20)
declare @SQL_STMT varchar(200)
declare @VARYYYYMMDD1_00 varchar(20)
declare @VARYYYYMMDD2_00 varchar(20)
IF @STATTYPE=1
begin
set @VARYYYYMMDD1_00 = @VARYYYYMMDD1 + '00'
set @VARYYYYMMDD2_00 = @VARYYYYMMDD2 + '00'
set @SQL_STMT='SELECT top 1 TIME_ID FROM '+@VARTABLE+' WHERE KBP='+@VARKBP+' AND KPI_NO='+@VARKPI_NO+' AND TIME_ID>='+@VARYYYYMMDD1_00+' AND TIME_ID<'+@VARYYYYMMDD2_00+' ORDER BY VALUEMIN'
--set @result=(SELECT top 1 TIME_ID FROM @VARTABLE WHERE KBP=@VARKBP AND KPI_NO=@VARKPI_NO AND TIME_ID>=@VARYYYYMMDD1_00 AND TIME_ID<@VARYYYYMMDD2_00 ORDER BY VALUEMIN)
set @result= exec(@SQL_STMT)
end
ELSE
begin
set @result=(SELECT top 1 MINVALUETIME FROM PM_TEMP_DAY WHERE KBP=@VARKBP AND KPI_NO=@VARKPI_NO ORDER BY VALUEMIN)
end
return @result
END
在IF语句成立时,如何得到@result?

解决方案 »

  1.   

    哦,我现在把Oracle的自定义函数和存储过程转为SQL Server的,但还不清楚SQL Server的动态语句,如果是存储过程呢,又该怎么写啊?
      

  2.   

    问题的关键在于如何得到@result并返回,相信总有方法吧,望大家赐教
      

  3.   

    --TRY
    IF EXISTS (SELECT NAME
               FROM   SYSOBJECTS
               WHERE  NAME = 'proc_1'
                      AND TYPE = 'P')
      DROP PROC PROC_1 CREATE PROC PROC_1(
               @STATTYPE     FLOAT,
               @VARTABLE     VARCHAR(30),
               @VARKBP       FLOAT,
               @VARKPI_NO    FLOAT,
               @VARYYYYMMDD1 VARCHAR(20),
               @VARYYYYMMDD2 VARCHAR(20),
               @result       FLOAT OUTPUT)
    AS
      BEGIN
        DECLARE
          @result NUMERIC(20)
        DECLARE
          @SQL_STMT VARCHAR(200)
        DECLARE
          @VARYYYYMMDD1_00 VARCHAR(20)
        DECLARE
          @VARYYYYMMDD2_00 VARCHAR(20)
        IF @STATTYPE = 1
          BEGIN
            SET @VARYYYYMMDD1_00 = @VARYYYYMMDD1 + '00'
            SET @VARYYYYMMDD2_00 = @VARYYYYMMDD2 + '00'
            SET @SQL_STMT = 'SELECT top 1 TIME_ID FROM ' + @VARTABLE + ' WHERE KBP=' + @VARKBP + ' AND KPI_NO=' + @VARKPI_NO + ' AND TIME_ID>=' + @VARYYYYMMDD1_00 + ' AND TIME_ID<' + @VARYYYYMMDD2_00 + ' ORDER BY VALUEMIN'
                                                                                                                                                                                                          --set @result=(SELECT top 1 TIME_ID FROM @VARTABLE WHERE KBP=@VARKBP AND KPI_NO=@VARKPI_NO AND TIME_ID>=@VARYYYYMMDD1_00 AND TIME_ID<@VARYYYYMMDD2_00 ORDER BY VALUEMIN)
            SET @result = EXEC ( @SQL_STMT )
          END
         ELSE
          BEGIN
            SET @result = (SELECT   top 1    MINVALUETIME
                           FROM     PM_TEMP_DAY
                           WHERE    KBP = @VARKBP
                                    AND KPI_NO = @VARKPI_NO
                           ORDER BY VALUEMIN)
          END
      END
      

  4.   

    --没测试CREATE proc proc_1
    (
     @STATTYPE numeric(5),
     @VARTABLE nvarchar(30),
     @VARKBP numeric(5),
     @VARKPI_NO numeric(5),
     @VARYYYYMMDD1 nvarchar(20),
     @VARYYYYMMDD2 nvarchar(20),
     @result numeric(20) OUTPUT
    )declare @SQL_STMT nvarchar(200)
    declare @VARYYYYMMDD1_00 nvarchar(20)
    declare @VARYYYYMMDD2_00 nvarchar(20)IF @STATTYPE=1
     begin
    set @VARYYYYMMDD1_00 = @VARYYYYMMDD1 + '00'
    set @VARYYYYMMDD2_00 = @VARYYYYMMDD2 + '00'
    set @SQL_STMT='SELECT top 1 @result=TIME_ID FROM '+@VARTABLE+' WHERE KBP='+@VARKBP+' AND KPI_NO='+@VARKPI_NO+' AND TIME_ID>='+@VARYYYYMMDD1_00+' AND TIME_ID<'+@VARYYYYMMDD2_00+' ORDER BY VALUEMIN'
    exec sp_executesql @SQL_STMT,N'@result numeric(20) OUTPUT',@result OUTPUT
     end
    ELSE
     begin
    set @result=(SELECT top 1 MINVALUETIME FROM PM_TEMP_DAY WHERE KBP=@VARKBP AND KPI_NO=@VARKPI_NO ORDER BY VALUEMIN)
     end
    END
      

  5.   

    我也寫了個,邪貼上來吧,估計都是差不多的IF EXISTS (SELECT name from sysobjects where name='proc_1' AND Xtype='P')
      DROP ProceDure proc_1
    GOCREATE ProceDure proc_1
    (@STATTYPE numeric(5),
     @VARTABLE varchar(30),
     @VARKBP numeric(5),
     @VARKPI_NO numeric(5),
     @VARYYYYMMDD1 varchar(20),
     @VARYYYYMMDD2 varchar(20),
     @result numeric(20) OUTPUT
     )
    As
    BEGIN
    declare @SQL_STMT Nvarchar(2000)
    declare @VARYYYYMMDD1_00 varchar(20)
    declare @VARYYYYMMDD2_00 varchar(20)
    IF @STATTYPE=1
    begin
    set @VARYYYYMMDD1_00 = @VARYYYYMMDD1 + '00'
    set @VARYYYYMMDD2_00 = @VARYYYYMMDD2 + '00'
    set @SQL_STMT='SELECT top 1 @result=TIME_ID FROM '+@VARTABLE+' WHERE KBP='+@VARKBP+' AND KPI_NO='+@VARKPI_NO+' AND TIME_ID>='+@VARYYYYMMDD1_00+' AND TIME_ID<'+@VARYYYYMMDD2_00+' ORDER BY VALUEMIN'
    --set @result=(SELECT top 1 TIME_ID FROM @VARTABLE WHERE KBP=@VARKBP AND KPI_NO=@VARKPI_NO AND TIME_ID>=@VARYYYYMMDD1_00 AND TIME_ID<@VARYYYYMMDD2_00 ORDER BY VALUEMIN)
    EXEC sp_executesql @SQL_STMT, N'@result Int output', @result output
    end
    ELSE
    begin
    set @result=(SELECT top 1 MINVALUETIME FROM PM_TEMP_DAY WHERE KBP=@VARKBP AND KPI_NO=@VARKPI_NO ORDER BY VALUEMIN)
    end
    END
    GO
      

  6.   

    在 SET @result = EXEC ( @SQL_STMT ) 时有错误,可以肯定@result不能通过这种方式来得到
      

  7.   

    --获取值
    EXEC sp_executesql @SQL_STMT, N'@result Int output', @result output
      

  8.   

    IF EXISTS (SELECT NAME
               FROM   SYSOBJECTS
               WHERE  NAME = 'proc_1'
                      AND XTYPE = 'P')
      DROP PROCEDURE PROC_1 GO
    CREATE PROCEDURE PROC_1(
                    @STATTYPE     NUMERIC(5),
                    @VARTABLE     VARCHAR(30),
                    @VARKBP       NUMERIC(5),
                    @VARKPI_NO    NUMERIC(5),
                    @VARYYYYMMDD1 VARCHAR(20),
                    @VARYYYYMMDD2 VARCHAR(20),
                    @result       NUMERIC(20) OUTPUT)
    AS
      BEGIN
        DECLARE
          @SQL_STMT NVARCHAR(2000)
        DECLARE
          @VARYYYYMMDD1_00 VARCHAR(20)
        DECLARE
          @VARYYYYMMDD2_00 VARCHAR(20)
        IF @STATTYPE = 1
          BEGIN
            SET @VARYYYYMMDD1_00 = @VARYYYYMMDD1 + '00'
            SET @VARYYYYMMDD2_00 = @VARYYYYMMDD2 + '00'
            SET @SQL_STMT = 'SELECT top 1 @result=TIME_ID FROM ' + @VARTABLE + ' WHERE KBP=' + @VARKBP + ' AND KPI_NO=' + @VARKPI_NO + ' AND TIME_ID>=' + @VARYYYYMMDD1_00 + ' AND TIME_ID<' + @VARYYYYMMDD2_00 + ' ORDER BY VALUEMIN'
                                                                                                                                                                                                                  --set @result=(SELECT top 1 TIME_ID FROM @VARTABLE WHERE KBP=@VARKBP AND KPI_NO=@VARKPI_NO AND TIME_ID>=@VARYYYYMMDD1_00 AND TIME_ID<@VARYYYYMMDD2_00 ORDER BY VALUEMIN)
            EXEC SP_EXECUTESQL  @SQL_STMT ,
                                N'@result Int output' ,
                                @result OUTPUT
          END
         ELSE
          BEGIN
            SET @result = (SELECT   top 1  MINVALUETIME
                           FROM     PM_TEMP_DAY
                           WHERE    KBP = @VARKBP
                                    AND KPI_NO = @VARKPI_NO
                           ORDER BY VALUEMIN)
          END
      ENDGO
      

  9.   

    我的寫的有問題,沒想到zlp321002(龙卷风2006) 也復制時沒發現了。:)這句要改下。EXEC sp_executesql @SQL_STMT, N'@result numeric(20) output', @result output