Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 用户定义函数中的Sql Server表结构_Tsql_User Defined Functions_Temp Tables - Fatal编程技术网

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

Tsql 用户定义函数中的Sql Server表结构,tsql,user-defined-functions,temp-tables,Tsql,User Defined Functions,Temp Tables,在我的电子商务门户中,我收到来自分销商的产品EAN代码。我想完成EAN-12代码计算,然后返回EAN-13 原始代码从SQL Server表中读取,并通过存储过程复制到另一个SQL Server数据库中 我希望在现有存储过程中计算校验和数字,而不添加其他编程层。计算校验和的算法基于数字掩码(它将EAN数字乘以位置权重值,对结果求和,并用下一个更大的10倍计算差值) 非常简单,UDF可以实现该算法,但需要使用临时表来处理数字操作,SQL Server不允许在UDF中使用临时表!! 你知道附近有什么

在我的电子商务门户中,我收到来自分销商的产品EAN代码。我想完成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)

无需使用临时表即可完成此操作(代码用于SQL 2008):

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

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

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

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字符串值返回。

好的,我知道简单的解决方案,即在UDF中定义12个变量,每个EAN-12数字一个。但是很糟糕:(为什么
10
等于
100-92
?如果这对你来说是个愚蠢的问题,我很抱歉,我对EAN-12/13一无所知。
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