用户定义函数内的 Sql Server 表结构

Posted

技术标签:

【中文标题】用户定义函数内的 Sql Server 表结构【英文标题】:Sql Server table structure inside a user defined function 【发布时间】:2012-03-09 11:41:52 【问题描述】:

在我的电子商务门户中,我收到了来自分销商的产品 EAN 代码。我想完成计算checksum digit 的 EAN-12 代码,然后返回 EAN-13。

原始代码从 SQL Server 表中读取,并通过存储过程复制到另一个 SQL Server 数据库中。

我想在现有存储过程中计算校验和数字,而不添加其他编程层。计算校验和的算法基于数字掩码(它将 EAN 数字乘以位置权重值,将结果相加并计算下一个更大的 10 倍数的差)。

很简单,UDF 可以实现该算法,但它需要使用临时表来处理对数字的操作,SQL Server 不允许在 UDF 中使用临时表! 你知道有什么解决办法吗?

算法细节和示例:

EAN-12:   7  2  5  1  8  4  6  6  0  4  0  5
weights:  1  3  1  3  1  3  1  3  1  3  1  3
multip:   7 6  5  3  8 12  6 18  0 12  0 15
sum:      92
checksum:  8 (= 100 - 92)

【问题讨论】:

好的,我知道简单的解决方案,即在 UDF 中定义 12 个变量,每个 EAN-12 位一个。但是很烂:( 为什么10 等于100 - 92?对不起,如果这对你来说是个愚蠢的问题,我对 EAN-12/13 一无所知。 【参考方案1】:

您可以在不使用临时表的情况下执行此操作(代码适用于 SQL 2008):

  CREATE FUNCTION [dbo].[ac_fnEan12ToEan13](@input varchar(12))
  RETURNS varchar(13)
  AS
  BEGIN
    declare @weights varchar(12) = '131313131313'
    declare @loop int = len(@input)
    declare @sum int = 0
    while @loop > 0
    begin
      set @sum = @sum + cast(SUBSTRING(@weights, @loop, 1) as int) * cast(SUBSTRING(@input, @loop, 1) as int)        
      set @loop = @loop -1
    end
    return @input + cast((10*ceiling(@sum / 10.0)) - @sum as varchar(1))
  END
  go

[编辑] 但如果你愿意,你也可以在函数中使用表变量,它们比临时表更有效:

    declare @values table (digit int, value int, primary key (digit))
    insert @values select 1, 7

【讨论】:

【参考方案2】:

以下函数将根据您的描述计算校验和。它不需要临时表,尽管它确实使用基于集合的方法来完成任务:

CREATE FUNCTION dbo.GetEAN13CheckSum (@EAN12 varchar(12))
RETURNS int
AS BEGIN
  DECLARE @result int;
  WITH EAN12_split AS (
    SELECT
      weight = 3 - number % 2 * 2,
      digit  = CAST(SUBSTRING(@EAN12, number, 1) AS int)
    FROM master..spt_values
    WHERE type = 'P'
      AND number BETWEEN 1 AND 12
  )
  SELECT @result = 10 - SUM(weight * digit) % 10
  FROM EAN12_split;
  RETURN @result;
END

当然,您可以对其进行修改,以便将校验和添加到 EAN-12 代码中,并将结果作为 EAN-13 字符串值返回。

【讨论】:

以上是关于用户定义函数内的 Sql Server 表结构的主要内容,如果未能解决你的问题,请参考以下文章

设置Sql server用户对表视图存储过程架构的增删改查权限

SQL Server 用户定义函数返回表——不能从选择查询中调用它

SQL Server用户定义的函数(UDF)使用详解

sqlserver导入导出数据库结构及创建用户分配权限

更改Sql server中表列使用的用户定义函数体

缓存用户定义函数的输出(ms sql server)