【发布时间】:2021-12-12 06:13:51
【问题描述】:
由于Direct Query数据连接模式,我需要使用一个函数才能通过Power BI使用它,Power BI无法使用存储过程。
因此我试图从存储过程中创建一个函数。
以下是我要从中创建函数的存储过程:
ALTER PROCEDURE [dbo].[SPTest]
@Anio int,
@Mes int
AS
BEGIN
DECLARE @AnioMes varchar(8),
@AnioMes6 varchar(8)
IF @Anio IS NULL
SELECT @Anio = YEAR(GETDATE()),
@Mes = MONTH(GETDATE())
SELECT
@AnioMes = (CASE WHEN @Mes = 12 THEN @Anio + 1 ELSE @Anio END * 100 +
CASE WHEN @Mes = 12 THEN 1 ELSE @Mes + 1 END) * 100 + 1
SELECT
@AnioMes6 = CONVERT(varchar(8), DATEADD(mm, -5, @AnioMes), 112)
SELECT
YEAR(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME)) * 100 +
MONTH(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME)) AS AnioMes,
DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME) AS FECHA_CREACION,
INPUTSUBJECT,
CASE
WHEN TOWTYPE = 1 THEN 'T1'
WHEN TOWTYPE = 2 THEN 'T2'
WHEN TOWTYPE = 3 THEN 'T3'
WHEN TOWTYPE = 4 THEN 'T4'
ELSE ''
END AS TOWTYPE,
[VENDNAME]
FROM
TRUCKS
WHERE
YEAR(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME)) >= yEAR(@AnioMes6)
AND MONTH(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME)) <= MONTH(@AnioMes)
AND DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME) >= '20160701'
希望有人能给我一些关于如何从这个存储过程创建函数的指导
我已尝试执行以下操作:
CREATE FUNCTION [dbo].[SPTest]
(
@Anio int,
@Mes int,
@AnioMes varchar(8),
@AnioMes6 varchar(8)
)
RETURNS TABLE
AS
BEGIN
if @Anio is null
Select @Anio = YEAR(GETDATE()),
@Mes = MONTH(GETDATE())
Select @AnioMes = (case when @Mes=12 then @Anio+1 else @Anio end *100 + Case when @Mes=12 then 1 else @Mes+1 end)*100 + 1
Select @AnioMes6 = convert(varchar(8), DATEADD(mm, -5, @AnioMes), 112 )
SELECT year(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME))*100+month(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME)) as AnioMes
,DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME) as FECHA_CREACION
,INPUTSUBJECT
,Case When TOWTYPE = 1 then 'T1'
When TOWTYPE = 2 then 'T2'
When TOWTYPE = 3 then 'T3'
When TOWTYPE = 4 then 'T4'
Else ''
End as TOWTYPE
,[VENDNAME]
FROM TRUCKS
Where year(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME)) >= yEAR(@AnioMes6)
and month(DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME)) <= MONTH(@AnioMes)
AND DATEADD(second, DATEDIFF(second, GETUTCDATE(), GETDATE()), CREATEDDATETIME) >= '20160701'
END
RETURN
我在 BEGIN 中收到以下错误:
BEGIN 附近的语法不正确
【问题讨论】:
-
@DaleK 我已经根据文档尝试过,您可以查看我的最新更新
-
@DaleK 但是在我的情况下我不能忽略参数,我也在存储过程中使用它,我应该对函数进行任何更正吗?
-
阅读CREATE FUNCTION (Transact-SQL) 文档。如果你想要一个像你现在这样的多语句表值函数,那么你需要指定你要返回的表的模式。
-
@DaleK 你的意思是这些变量
@Anio @Month @YearMonth @ AnioMes6 -
@DaleK 由于 Direct Query 数据连接模式,我需要使用一个函数才能通过 Power BI 使用它,Power BI 无法使用存储过程,这就是为什么我不得不使用函数
标签: sql sql-server tsql stored-procedures