Sql 使用游标创建表值函数

Sql 使用游标创建表值函数,sql,sql-server,Sql,Sql Server,这是我的第一个表值函数 我有一个叫tableFunc的桌子 “我的表”包含以下列: Empid 2361023611…-唯一的 ChDate 2015-4-2122:02:10.8072015-4-2122:02:11.050,。。。 站点25所有值都相同 用户标识7,7-同样的价值 初始值0,0-同样的价值 finsal 0.696176161,0.696176161,…-所有值相同 注意:输入文本,输入文本-同样的价值 我想创建一个带有游标的表值函数,该游标将获取所有行并只返回唯一的记录。我

这是我的第一个表值函数

我有一个叫tableFunc的桌子

“我的表”包含以下列:

Empid 2361023611…-唯一的 ChDate 2015-4-2122:02:10.8072015-4-2122:02:11.050,。。。 站点25所有值都相同 用户标识7,7-同样的价值 初始值0,0-同样的价值 finsal 0.696176161,0.696176161,…-所有值相同 注意:输入文本,输入文本-同样的价值 我想创建一个带有游标的表值函数,该游标将获取所有行并只返回唯一的记录。我愿意接受其他建议


谢谢

这将选择不同的值:

SELECT DISTINCT Empid,
                [Site],
                userID,
                initsal,
                finsal,
                note
FROM tableFunc A
GROUP BY Empid,[Site],userID,initsal,finsal,note
如果希望不同的EMPID具有chDate列表:

SELECT  Empid,
        STUFF   (
                (
                SELECT ',' + CAST(chDate AS VARCHAR(30))
                FROM tableFunc SubQuery
                WHERE SubQuery.Empid = A.Empid
                FOR XML PATH('')
                ),
                1,1,'') AS ChDateList,
        [Site],
        userID,
        initsal,
        finsal,
        note,
        MAX(chDate) AS recent_chDate
FROM tableFunc A
GROUP BY Empid,[Site],userID,initsal,finsal,note

以下是编写表值函数以从tablefunc表中获取唯一记录的一种方法:

CREATE FUNCTION dbo.GetUniqueRecords() 
RETURNS @TableFunc TABLE (
    --I am not sure how you have these datatypes defined, but change it to your needs
    EmpId INT NOT NULL
    ,ChDate datetime
    ,Site INT
    ,userid INT
    ,initsal MONEY
    ,finsal MONEY
    ,note VARCHAR(200)
    )
AS
BEGIN
    INSERT into @TableFunc(EmpId,ChDate,Site,userid,initsal,finsal,note)
    SELECT Empid
        ,max(ChDate)
        ,max([Site])
        ,max(userID)
        ,max(initsal)
        ,max(finsal)
        ,max(note)
    FROM tableFunc
    GROUP BY Empid;

    RETURN;
END
GO

希望这有帮助

您使用的是哪种RDBMS Oracle、MySQL等?您是否考虑过SELECT DISTINCT,如果不考虑,为什么不考虑?我使用的是SQL Server。我试图将此表与其他表一起使用以创建视图,这样做时会得到重复的记录。所以SELECT DISTINCT不起作用。实际上它们不是重复的,因为ChDate是不同的。。。您只想要其他不重复的列吗?Stephan,是的,我希望能够通过此表获取并返回不重复的行。如果可以,请尽量避免使用光标-在99%的情况下,您可以!Stephan,我在运行上一个查询时遇到以下错误:Msg 195,级别15,状态10,第4行“CONCAT”不是可识别的内置函数名。Stephan,nice和我可以确认没有重复项,我如何告诉sql返回报告中最新的chDate。我添加了列recent_chDateRookie13,谢谢。我更新了代码以反映您的代码。现在可以添加一个游标,它可以通过行获取并返回最新的记录,可能是按日期和时间。太好了!我很高兴这有帮助。如果我理解正确,上面的函数应该已经为您带来了基于您的ChDate的最新记录。这就是你要找的吗?在ChDate日期时间后有一个额外的逗号。我删除了它,您能再试一次吗?初始表包含747行。当我运行这个函数时,我得到了相同数量的记录。您的tableFunc表是否有多行相同的EmpId?如果我们没有多个ID,您将始终返回一组不同的记录。否则,此函数应返回具有重复记录的所有员工。