MS SQL Select/Where 函数仅匹配值的第一位

MS SQL Select/Where Function Only Matching on First Digit of Value

我的 MS SQL 数据库中有以下 tables -

停机时间

Row | Time | Running | FaultID | Fault
----|------|---------|---------|-------
 1  |00:00 |    1    |   110   |   -
 2  |00:10 |    0    |   110   |   A
 3  |02:00 |    1    |   320   |   -
 4  |02:15 |    0    |   1     |   A
 5  |02:40 |    1    |   350   |   -
 6  |04:00 |    0    |   158   |   A
 7  |04:10 |    1    |   110   |   -
 8  |04:20 |    0    |   210   |   C
 7  |04:30 |    1    |   110   |   -
 9  |06:10 |    0    |   28    |   C
 10 |06:40 |    1    |   110   |   -

故障代码

FaultCode | Fault
----------|-------
 1        |A
 28       |C
 110      |D
 158      |E
 210      |F
 320      |G
 350      |H

所以 'Fault Codes' table 是所有代码定义的列表,'Downtime' 是实际的实时数据。 'Downtime' table 中的 Fault 列是具有此 SQL -

的计算列
(case when [Running]=(1) then NULL else [dbo].[UDF_KG78Faults]([FaultID]) end)

并且链接到的 UDF 具有此代码 -

FUNCTION [dbo].[UDF_KG78Faults] (@FaultID VarChar)
    RETURNS VARCHAR(100)
    AS
    BEGIN
        DECLARE @FaultDesc VARCHAR(100)
            SELECT @FaultDesc = Fault
            From KG78FaultCodes
            WHERE FaultCode = @FaultID
        RETURN @FaultDesc

现在这是我的问题 -

故障 ID 应该为每个唯一编号返回不同的故障描述。实际发生的情况是,当值类似于 1、15、110、150 等时;它只匹配使用第一个数字而不是整个条目。

FaultID 列最初被格式化为整数,但由于数据被拉入,我遇到了 int 转换错误。将其更改为 Varchar 解决了一个问题,但创建了这个新问题。

是否可以编辑我的 UDF 以匹配整个条目而不仅仅是第一个数字?

在您的函数定义中为@FaultID 添加一个长度(使其成为 VARCHAR(3) 或类似的东西)。如果您不指定 VARCHAR 长度,它将默认为 1,因此您传递给 UDF 的 FaultID 将被截断为 1 个字符。