由于直接查詢資料連接模式,我需要使用一個函式才能通過 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 附近的語法不正確
uj5u.com熱心網友回復:
首先,您應該始終嘗試使用行內表值函式,因為它們的性能要好得多。
行內函式沒有BEGINorEND并且只能包含一個AS RETURN SELECT陳述句。
- 注意變數是如何轉換成
VALUES子句的 - 避免對列使用函式。不要轉換
CREATEDDATETIME為時區進行比較,而是將您的引數轉換為 UTC - 出于同樣的原因,不要比較日期的各個部分,構建起點和終點并與之進行比較
- 不要使用字串轉換來創建日期,它很慢并且可能是不確定的。而是使用可用的正確日期函式
CREATE OR ALTER FUNCTION [dbo].[SPTest] (
@month DATETIME
)
RETURNS TABLE
AS RETURN
SELECT
v1.AnioMes
,t.CREATEDDATETIME AT TIME ZONE 'YourTimeZoneHere' as FECHA_CREACION
,t.INPUTSUBJECT
,CASE WHEN t.TOWTYPE IN (1,2,3,4)
THEN CONCAT('T', t.TOWTYPE)
ELSE '' END AS TOWTYPE
,t.[VENDNAME]
FROM (VALUES (
DATEADD(day, 1, EOMONTH(TODATETIMEOFFSET(@month, 0)))
)) v1(AnioMes)
CROSS APPLY (VALUES (
DATEADD(month, -5, v1.AnioMes)
)) v2(AnioMes6)
CROSS JOIN TRUCKS t
WHERE t.CREATEDDATETIME >= v2.AnioMes6
AND t.CREATEDDATETIME < v1.AnioMes
AND t.CREATEDDATETIME >= '20160701';
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/340107.html
標籤:sql sql-server 查询语句 存储过程
