当实际结果包含多行时,表值函数仅返回一行

时间:2014-11-07 12:25:18

标签: sql-server-2008 tsql

我的表Clients包含许多列,但我的目标是两个特定列ClientIdPIN。我将要提供的示例没有多大意义,但我只是在学习更高级的SQL(T-SQL)主题,而我的最终目标与此处的内容有很大不同。

所以我创建了一个函数,我希望返回符合特定搜索条件的所有行。所以我有这个:

CREATE FUNCTION ufn_NumberOfClients (@ClientId INT)
  RETURNS @retContactInformation TABLE 
  (
    -- Columns returned by the function
    ClId int PRIMARY KEY NOT NULL,
    PIN nvarchar(50) NULL
  )
  AS
  BEGIN
    DECLARE 
    @ClId INT, 
    @PIN nvarchar(50) 

    SELECT @ClId = ClientId, @PIN = PIN
    FROM Client
    WHERE PIN LIKE '%7788%'

    IF @ClientId IS NOT NULL 
    BEGIN
        INSERT @retContactInformation
        SELECT @ClId, @PIN;
    END;
RETURN;
END

但是当我执行函数时:

SELECT * FROM
ufn_NumberOfClients(4)

我只得到一个结果。即使这是一个有效的结果,如果我只执行

SELECT * FROM Client
WHERE PIN LIKE '%7788%'

我得到5个结果,该函数只返回最后一个。

值得一提的两件事。我用来从表中编写ClId int PRIMARY KEY NOT NULL,函数的示例在此之后不是DECLARE,但如果我不这样做,我会收到错误。另外,我传递变量,但我认为它没有被使用,因此它不应该影响行为(或者至少我认为是这样)。

那么如何通过函数返回与搜索crieria匹配的所有结果?

1 个答案:

答案 0 :(得分:2)

您实际上现在只在表变量中插入一行,请改为尝试:

CREATE FUNCTION ufn_NumberOfClients (@ClientId INT)
RETURNS @retContactInformation TABLE 
(
-- Columns returned by the function
ClId int PRIMARY KEY NOT NULL,
PIN nvarchar(50) NULL
)
AS
BEGIN

INSERT INTO @retContactInformation
SELECT ClientId, PIN
FROM Client
WHERE PIN LIKE '%7788%';

RETURN;
END