我有一台连接到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' 必须是在此批中唯一的语句
这个错误是否意味着我不能在函数中创建临时表?
您不能在函数中执行动态sql。您将不得不将其转换为存储过程。 https://msdn.microsoft.com/en-us/library/ms191320.aspx –