Sql 在Insert/Select语句中存储和重用函数结果

Sql 在Insert/Select语句中存储和重用函数结果,sql,sql-server,Sql,Sql Server,我有一个触发器,它基本上接受varchar字段的in_address值,并且根据值是否为数字,设置一些不同的值。下面的选择显示了我如何获取值 INSERT INTO ........... --irrelevant names SELECT case when ISNUMERIC(in_address)=1 then convert( tinyint, left( in_address,1 ) ) else 9 end, case when IS

我有一个触发器,它基本上接受varchar字段的in_address值,并且根据值是否为数字,设置一些不同的值。下面的选择显示了我如何获取值

    INSERT INTO ........... --irrelevant names
    SELECT 
        case when ISNUMERIC(in_address)=1 then convert( tinyint, left( in_address,1 ) ) else 9 end,
        case when ISNUMERIC(in_address)=1 then xlat_byte else 9 end,
        case when ISNUMERIC(in_address)=1 then xlat_bit else 9 end,
        case when ISNUMERIC(in_address)=1 then 'xlat_' else '' end+in_address,
    FROM [in],##in_xlat 
    WHERE (ISNUMERIC(in_address)=1 AND in_xlat_address = right(in_address, 2)) or ISNUMERIC(in_address)=0 AND in_xlat_address = 1

我想知道是否有一种方法可以存储第一次ISNUMERICin_地址调用的结果并重用它们,而不是每次都重新计算

您可以像这样使用外部应用:

  INSERT INTO ........... --irrelevant names
    SELECT 
        case when numbers.isnumber=1 then convert( tinyint, left( in_address,1 ) ) else 9 end,
        case when  numbers.isnumber=1 then xlat_byte else 9 end,
        case when  numbers.isnumber=1 then xlat_bit else 9 end,
        case when  numbers.isnumber=1 then 'xlat_' else '' end+in_address,
    FROM [in],##in_xlat 
      outer apply (select isnumeric(in_address) as isnumber from [in] in2 where in2.keyfields = [in].keyfields) as numbers
    WHERE (numbers.isnumber=1 AND in_xlat_address = right(in_address, 2)) ornumbers.isnumber=0 AND in_xlat_address = 1

在insert命令之前执行此操作。ISNUMERIC的结果是特定于行的,因此我需要对每行重新计算。in_address是一个varchar字段,因此某些行可能存储了数值,而其他行可能存储了字符串。您可以使用cte进行此类操作,您可以执行union all查询。上半部分是数字值,下半部分是其他值。好技巧!经过一点调试,使它工作起来,并完全按照我的需要来做。必须将[in]、inxlat替换为inxlat、[in],显然,由于[in]用于外部应用,因此必须保留在应用语句中。代码未经测试,应添加默认的“自担风险使用”免责声明: