SQL用户定义的函数

时间:2014-06-20 17:45:47

标签: sql sql-server-2008 user-defined-functions

我目前正在使用用户自定义函数,并且很难掌握关于函数如何接受一个参数并返回另一个参数的概念。

我有一张包含员工ID和日志ID的表。 UDF应接受EmployeeID并返回UserLoginID。 UserLoginID是'\'之后的LogID列的最后一部分。我需要从表中返回整个列。

表示例

EmployeeID   LoginId
1    database\userid1
2    database\userid2
3    database\userid3

UDF查询1:

CREATE FUNCTION dbo.fx_IDtest]
(@EmployeeID int)

RETURNS nvarchar(50)
AS
BEGIN
DECLARE @UserID nvarchar(50)
SET @UserID = (SELECT SUBSTRING(LoginID,CHARINDEX('\',LoginID)+1, LEN(LoginID)) 
            FROM HumanResources.Employee
            WHERE EmployeeID = @EmployeeID
            )
RETURN @UserID
END

UDF查询2:

CREATE FUNCTION [dbo].[fx_IDtest2] 
(@EmployeeID int)

RETURNS table
AS
RETURN
(SELECT SUBSTRING(LoginID,CHARINDEX('\',LoginID)+1, LEN(LoginID)) as USERID
            FROM HumanResources.Employee
            WHERE EmployeeID = @EmployeeID
            )

1 个答案:

答案 0 :(得分:0)

仅供参考...你的第一个功能很好,完全符合我的要求......我想也许你并没有正确地调用这个功能。

我测试了它如下......

/*
CREATE TABLE testDATA (EmployeeID int, LoginID nvarchar(50))

insert into testDATA
select 1,    'database\userid1' union
select 2,    'database\userid2' union
select 3,    'database\userid3'

CREATE FUNCTION dbo.fx_IDtest
(@EmployeeID int)

RETURNS nvarchar(50)
AS
BEGIN
DECLARE @UserID nvarchar(50)
SET @UserID = (SELECT SUBSTRING(LoginID,CHARINDEX('\',LoginID)+1, LEN(LoginID)) 
            FROM testDATA
            WHERE EmployeeID = @EmployeeID
            )
RETURN @UserID
END
*/

SELECT *, dbo.fx_IDtest(EmployeeID)
FROM testDATA
WHERE EmployeeID = 1

SELECT dbo.fx_IDtest(1)

两个select语句都给我userid1作为回报。

请注意,您必须在SELECT中提供UDF的架构,这经常被忽略。您无法执行SELECT fx_IDtest(1),而必须执行SELECT dbo.fx_IDtest(1)