如何解决SQL Server:在“开始”附近创建函数错误的语法
我在弄清楚如何消除错误时遇到了问题。它说 Begin 语句附近有错误的语法。我认为它以前是什么意思,但我不知道是什么。我尝试了许多不同的函数声明,但没有让它工作。
我有一个表,它在一个过程的每一步中都输入一行,用于多个过程。该函数应采用进程名称(单位)和时间,并应生成该进程从开始到结束的所有行。
CREATE FUNCTION [GetFullCIP]
(
@pTime DATETIME2,@pName NVARCHAR(50)
)
RETURNS TABLE
AS
BEGIN
DECLARE @cipid int
SELECT TOP(1) @cipid=unit_id FROM [dbo].[md_units] WHERE unit=@pName
DECLARE @stop Datetime2;
DECLARE @start Datetime2;
--start
SELECT TOP (1) @start=[begin_date] FROM [dbo].[log] WHERE [operation_id]=1 AND unit_id=@cipid AND [begin_date] <=@pTime ORDER BY [cip_id] DESC
--stop
SELECT TOP (1) @stop=[inserted_date] FROM [dbo].[log] WHERE [operation_id]=99 AND unit_id=@cipid AND [inserted_date]>=@pTime ORDER BY [cip_id] ASC
RETURN (SELECT * FROM [dbo].[log] WHERE unit_id=@cipid AND [begin_date]>=@start AND [inserted_date]<=@stop)
END
GO
我读到我应该给返回表一个名字,比如@resdata。我试过了,最后写 SET @resdata=(SELECT ...) 但这不起作用,因为它不再知道@resdata。
提前谢谢
解决方法
正如我所提到的,我会使用内联表值函数。由于没有样本数据或预期结果,这是未经测试的,但它是您发布的 ml-TVF 的直译。
CREATE FUNCTION dbo.[GetFullCIP] (@pTime datetime2(7),@pName nvarchar(50))
RETURNS table
AS RETURN
SELECT L.* --Replace this with your explicit columns
FROM dbo.log L
JOIN dbo.md_units MU ON L.unit_id = MU.unit_id
WHERE MU.Unit = @pName
AND L.begin_date >= (SELECT TOP (1) sq.begin_date
FROM dbo.log sq
WHERE sq.operation_id = 1
AND sq.unit_id = MU.unit_id
AND sq.begin_date <= @pTime
ORDER BY sq.cip_id DESC)
AND L.inserted_date <= (SELECT TOP (1) sq.inserted_date
FROM dbo.log sq
WHERE sq.operation_id = 99
AND sq.unit_id = MU.unit_id
AND sq.inserted_date >= @pTime
ORDER BY sq.cip_id ASC)
GO
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。