使用而不是触发器来转换数据类型

时间:2016-05-12 15:19:07

标签: sql-server

我有一个带有bigint列的表,我试图让插件工作。我们一直遇到无法转换为数字的数据进入且插入失败的问题。这主要是数据中的空格或行返回,即“123”,“1 365”。

由于我无法访问试图插入此错误数据的软件,我认为创建一个而不是触发器并使用一个函数去除所有非数字字符将解决问题。

这是触发器正在做什么的基本概念。

TRIGGER [dbo].[Delivery_Before_TRG] 
   ON  [dbo].[Delivery]
   instead of INSERT
AS 
BEGIN

    SET NOCOUNT ON;

    INSERT INTO [dbo].[Delivery]
           (....,[pin],....)
    select ....
           ,[dbo].[udf_GetNumericOnly](inserted.pin)
           ,....
    from inserted;

END

这是udf_GetNumberOnly函数。

FUNCTION [dbo].[udf_GetNumericOnly]
(
    @Value varchar(500)
)
RETURNS bigint
AS

BEGIN

    Declare 
        @Pos tinyint,
        @Char char(1)

    Set @Value = REPLACE(@Value, ' ', '')       -- Strip all spaces
    Set @Pos = LEN(@Value)                      -- Give some non-zero value
    While @Pos > 0
        Begin
            Set @Pos = PATINDEX('%[^0-9]%', @Value)     )
            If @Pos > 0 
                Begin
                    Set @Char = SUBSTRING(@Value, @Pos, 1)      -- Non numeric character
                    Set @Value = REPLACE(@Value, @Char, '')
                End
        End

    Set @Value = RTrim(LTrim(@Value))

    Return convert(bigint,@Value)

END

我可以运行该函数,它将为我传递的任何内容删除所有非数字字符,但是,当我尝试在我的表中运行insert语句时,我得到一个 Msg 8114,Level 16,State 5,第4行 将数据类型varchar转换为bigint时出错。错误。

从我可以告诉的问题是,在我的触发器获取数据转换之前,sql server检查我尝试插入的字段是否与目标表列数据类型匹配。我知道这是因为我修改了触发器以将数字直接插入引脚字段并仍然会出现此错误。

此外,我知道这不是函数失败,因为我可以编写一个失败的插入,然后更改该插入以调用该函数,它将起作用。

--This fails
INSERT INTO (....,pin,...)
VALUES(....,'1a23',....)

--This works
INSERT INTO (....,pin,...)
VALUES(....,udf_GetNumericOnly('1a23'),....)

1 个答案:

答案 0 :(得分:0)

是的,在解析器确保您编写了有效的sql之后,algebrizer会立即查看查询中的数据类型。 INSTEAD OF INSERT触发器将为每个要插入的行触发,这将导致无效的强制转换。