You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在T-SQL中通过存储过程或函数返回两个房产结果表?

如何用T-SQL分离空置与已占用房产数据?

当然可以实现!不过得先给你提个醒:表值函数只能返回单个结果集,如果想一次执行就拿到空置、已占用两个独立的结果表,存储过程是更合适的选择。如果非要用函数,那得写两个单独的函数分别返回。下面我给你两种方案的代码,顺便修正你原来代码里的小问题~

方案一:用存储过程返回两个结果集(推荐)

这是最便捷的方式,一次调用就能得到两个独立的结果表:

CREATE PROCEDURE GetPropertyStatusDetails
    @OwnerId INT
AS
BEGIN
    SET NOCOUNT ON; -- 屏蔽影响行数的系统消息,让结果更干净

    -- 第一个结果集:已占用的房产
    SELECT 
        p.OwnerId,
        p.Id AS PropertyId,
        tp.Id AS TenantId,
        p.Name AS PropertyName
    FROM 
        Property p
    INNER JOIN 
        TenantProperty tp ON p.Id = tp.PropertyId
    WHERE 
        p.OwnerId = @OwnerId
        AND tp.IsActive = 1; -- 用IsActive标记判断是否被占用

    -- 第二个结果集:空置的房产
    SELECT 
        p.OwnerId,
        p.Id AS PropertyId,
        NULL AS TenantId, -- 空置房产没有租户,用NULL填充
        p.Name AS PropertyName
    FROM 
        Property p
    LEFT JOIN 
        TenantProperty tp ON p.Id = tp.PropertyId
    WHERE 
        p.OwnerId = @OwnerId
        AND (tp.Id IS NULL OR tp.IsActive = 0); -- 无租户关联,或租户关系已失效
END

使用方式

直接执行存储过程就能拿到两个结果:

EXEC GetPropertyStatusDetails @OwnerId = 123; -- 替换成实际的OwnerId

方案二:用两个表值函数分别返回

如果你更倾向于用函数,那可以写两个独立的表值函数,分别查询空置和已占用房产:

1. 获取已占用房产的函数

CREATE FUNCTION GetOccupiedProperties (@OwnerId INT)
RETURNS @Occupied TABLE (
    OwnerId INT,
    PropertyId INT,
    TenantId INT,
    PropertyName VARCHAR(100) -- 注意:一定要指定VARCHAR长度,默认长度是1会截断数据!
)
AS
BEGIN
    INSERT INTO @Occupied
    SELECT 
        p.OwnerId,
        p.Id AS PropertyId,
        tp.Id AS TenantId,
        p.Name AS PropertyName
    FROM 
        Property p
    INNER JOIN 
        TenantProperty tp ON p.Id = tp.PropertyId
    WHERE 
        p.OwnerId = @OwnerId
        AND tp.IsActive = 1;

    RETURN;
END

2. 获取空置房产的函数

CREATE FUNCTION GetVacantProperties (@OwnerId INT)
RETURNS @Vacant TABLE (
    OwnerId INT,
    PropertyId INT,
    TenantId INT,
    PropertyName VARCHAR(100)
)
AS
BEGIN
    INSERT INTO @Vacant
    SELECT 
        p.OwnerId,
        p.Id AS PropertyId,
        NULL AS TenantId,
        p.Name AS PropertyName
    FROM 
        Property p
    LEFT JOIN 
        TenantProperty tp ON p.Id = tp.PropertyId
    WHERE 
        p.OwnerId = @OwnerId
        AND (tp.Id IS NULL OR tp.IsActive = 0);

    RETURN;
END

使用方式

分别调用两个函数获取结果:

-- 查询已占用房产
SELECT * FROM GetOccupiedProperties(123);

-- 查询空置房产
SELECT * FROM GetVacantProperties(123);

给你原来代码的小建议

你原来写的函数里有两个小问题需要注意:

  1. 不能直接写IF TenantProperty.IsActive = 1,表的列必须放在查询的WHERE条件里过滤;
  2. VARCHAR一定要指定长度,比如VARCHAR(100),否则默认是VARCHAR(1),会把你的房产名称截断成单个字符!

内容的提问来源于stack exchange,提问作者Renu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:06:39