如何将 varchar 传递给 tvf 并使用该参数来查询 SQL Server 的结果

问题描述 投票:0回答:1

我正在使用 TVF 根据主要项目经理的部门代码返回 recordID 列表。部门代码可以包含字母和数字字符,因此它被定义为 varchar。

这是我现在的TVF。

ALTER FUNCTION [dbo].[searchDeptCode](@inDeptCode varchar)
RETURNS @recordID TABLE 
(recordID int NOT NULL)
AS
BEGIN
    
    if (@inDeptCode IS NULL)
        INSERT INTO @recordID
            SELECT DISTINCT recordID
            FROM projectRecord ORDER BY recordID

    if (@inDeptCode IS NOT NULL)
        INSERT INTO @recordID
            SELECT DISTINCT recordID
            FROM projectRecord 
            WHERE dbo.getPersonDeptCode(dbo.getPersonID(recordID)) like '%' + @inDeptCode + '%'
            ORDER BY recordID
    RETURN
    
END

GO

这就是我的称呼,其中 54390 是部门代码。

select * from searchDeptCode('54390')

它应该返回 2 个 recordID,但它返回了表中的几乎所有记录。当我独立运行 select 语句时,它返回正确的 2 条记录。

我确信我错过了一些简单的东西,但无法指出它。

sql sql-server-2019
1个回答
1
投票

您应该始终(没有例外)为您的varchar参数、变量或列提供

长度
- 否则,就像参数的情况一样,您可能会遇到默认长度 1 个字符 .....

试试这个:

ALTER FUNCTION [dbo].[searchDeptCode](@inDeptCode VARCHAR(50))

并将

(50)
长度调整为适合您情况的任意长度。

另请参阅:要改掉的坏习惯:声明不带(长度)的 VARCHAR 了解更多背景和信息

© www.soinside.com 2019 - 2024. All rights reserved.