我正在使用TVF根据主要项目经理的部门代码返回记录ID列表. 部门代码可以包括字母和数字字符,因此它被定义为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条记录.

我确信我错过了一些简单的东西,但又无法准确地说出来.

推荐答案

您应该101(无例外)为您的varchar个参数、变量或列提供length-否则,就像参数的情况一样,您可能会遇到1 character中的default length.

试试这个:

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

并将(50)长度调整为适合您的情况的任何长度.

另请参阅:Bad habits to kick: declaring VARCHAR without (length)了解更多背景和信息

Sql相关问答推荐

如何在SQL查询中只比较日期时间的年份和月份(而忽略日期比较)?

SQL基于多个值 Select 单行

Lag()函数的差异:R与SQL(将R代码转换为SQL)

一个SQL查询将在需要的地方多次返回同一成员

数据库SQL PARSE_SYNTAX_ERROR

了解多个分组集

使用拆分器将已分组的不同值连接在一起

我如何才能在付款人单列中拉出只有9个付款人单的人?

如果另一个表中不存在值列,则插入失败

最小非重复集的SQL查询

此过程如何在不引用传递的参数值的情况下执行工作?

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

在 Oracle 21c 中透视文本值

如何计算两个非周期性时间序列+分组的重叠持续时间

BigQuery数组是否包含NULL值的判断方法

Postgres数据库维护:基于GROUP BY删除旧记录

使用给定的变量对在循环中执行更新语句

如何在 Trino/Presto 中过滤掉 map 中的某些键?