2016-04-21 103 views
0

我有一台连接到Oracle服务器的SQL Server 2014服务器。我想在函数中使用临时表来从Oracle数据库返回数据集,然后使用我的函数使用常规T-SQL返回结果。由于我是相当新的这个我接近,但我得到一个错误信息如何在SQL函数中包含临时表

消息156,级别15,状态1,过程GetBond 37行
关键字附近有语法错误“BEGIN”。

我已经发布了功能代码在这里:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER FUNCTION [dbo].[GetBond] 
    (@WarControlID bigint) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    --Create Temp Table 
    declare @TSQL varchar(max) 

    DECLARE @WarrantBail table 
    (
     WR_INVL varchar(5), 
     WR_WARR_CTL VarChar(10), 
     WR_Bail VarChar(50), 
     WC_BAIL VarChar(50) 
    ) 

    SELECT @TSQL = 'SELECT * FROM OPENQUERY(RMSPROD2,''SELECT TIBURON.WRMAST.WR_INVL, TIBURON.WRMAST.WR_WARR_CTL,TIBURON.WRMAST.WR_BAIL,TIBURON.WRWCHG.WC_BAIL 
        FROM TIBURON.WRMAST 
        LEFT JOIN TIBURON.WRWCHG ON WRWCHG.WC_WR_CHAIN = WRMAST.WRMAST_ROW 
        WHERE TIBURON.WRMAST.WR_WARR_CTL = ''''' + @WarControlID + ''''''')' 

    INSERT INTO @WarrantBail 
     EXEC (@TSQL) 
END 

BEGIN  
    -- Create a Variable 
    DECLARE @NoBailCount int 
    DECLARE @ChgCount int 
    DECLARE @WarTotalBond float 
    DECLARE @CHGTotalBond float 
    DECLARE @War_Final_Bail varchar(max) 

    Select COUNT(DISTINCT w.WR_Bail) AS NoBond_Count 
     From @WarrantBail w 
     Where w.WC_BAIL In ('No Bond', 'No Bail','None') Or w.WR_Bail In ('No Bond', 'No Bail','None') 

--***********Get Charge Count 
     Select COUNT(w.WC_BAIL) As ChgCount FROM @WarrantBail w 

     --******************IF the above fails then we have a bond check the Warrant bond amount 
     Select SUM (DISTINCT cast(w.WR_Bail As int)) AS WAR_Bond_Total 
       From @WarrantBail w 
       Where w.WR_Bail Not In ('No Bond', 'No Bail','None') 

--****************We may have additional charges get the total for those charges 
     Select SUM (cast(w.WC_BAIL As int)) AS CHG_BondTotal 
       From @WarrantBail w 
       Where w.WC_BAIL Not In ('No Bond', 'No Bail','None') 

    IF (@NoBailCount > 0) 
     Begin 

      SET @War_Final_Bail = 'NO BAIL' 
     End 
    ELSE IF @ChgCount > 0 
     Begin 
      SET @War_Final_Bail = @WarTotalBond + @CHGTotalBond 
     End 
    Else 
     Begin 
     SET @War_Final_Bail = @WarTotalBond 
     End 
    RETURN CONVERT(varchar(max), @War_Final_Bail) 

END 

除了当我执行的代码,我也看到了线下一个波浪线的错误“ALTER FUNCTION [DBO] [GetBond ]

该错误状态:

语法错误: 'ALTER FUNCTION' 必须是在此批中唯一的语句

这个错误是否意味着我不能在函数中创建临时表?

+3

您不能在函数中执行动态sql。您将不得不将其转换为存储过程。 https://msdn.microsoft.com/en-us/library/ms191320.aspx –

回答

0

感谢您的意见我是一个初级开发者和我刚开始我的SQL编程的第一口味的讨论后的高级开发人员,我能够完成一个任务通过使用存储过程。

谢谢您的意见。

0

为什么你在这里有END和BEGIN?认为这可能是你的问题之一。

Insert Into @WarrantBail 
     EXEC (@TSQL) 
END 

BEGIN  
    -- Create a Variable 
    DECLARE @NoBailCount int 

您是否绝对必须使用动态SQL?为什么不这样做?

INSERT INTO @WarrantBail 
SELECT * 
FROM OPENQUERY(RMSPROD2, ' 
    SELECT TIBURON.WRMAST.WR_INVL, 
    TIBURON.WRMAST.WR_WARR_CTL, 
    TIBURON.WRMAST.WR_BAIL, 
    TIBURON.WRWCHG.WC_BAIL 
    FROM TIBURON.WRMAST 
     LEFT JOIN TIBURON.WRWCHG ON WRWCHG.WC_WR_CHAIN = WRMAST.WRMAST_ROW 
    WHERE TIBURON.WRMAST.WR_WARR_CTL = ' + CAST(@WarControlID AS VARCHAR(30)) + ')')