我正在使用 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 条记录。
我确信我错过了一些简单的东西,但无法指出它。
您应该始终(没有例外)为您的varchar
参数、变量或列提供
长度- 否则,就像参数的情况一样,您可能会遇到的默认长度 1 个字符 .....
试试这个:
ALTER FUNCTION [dbo].[searchDeptCode](@inDeptCode VARCHAR(50))
并将
(50)
长度调整为适合您情况的任意长度。
另请参阅:要改掉的坏习惯:声明不带(长度)的 VARCHAR 了解更多背景和信息