Sql server 是否存在与QlikView的AutoNumber()等效的SQL Server函数?

Sql server 是否存在与QlikView的AutoNumber()等效的SQL Server函数?,sql-server,function,scalar,autonumber,Sql Server,Function,Scalar,Autonumber,首先:这不是一种IDENTITY()字段 在QlikView中,它用于根据发送给函数的参数生成一个数字。 请参见此处的文档: 简而言之,您向它发送一个参数,它将返回一个整数,该整数将标识脚本其余部分的相同参数。如果你发送 AutoNumber('Name 900') -> returns 1 AutoNumber('Name 300') -> returns 2 AutoNumber('Name 001') -> returns 3 AutoNumber

首先:这不是一种IDENTITY()字段

在QlikView中,它用于根据发送给函数的参数生成一个数字。 请参见此处的文档:

简而言之,您向它发送一个参数,它将返回一个整数,该整数将标识脚本其余部分的相同参数。如果你发送

   AutoNumber('Name 900') -> returns 1
   AutoNumber('Name 300') -> returns 2
   AutoNumber('Name 001') -> returns 3
   AutoNumber('Name 900') -> returns 1 ... again 
因为参数已经在AutoNumber的实习生列表中

我尝试在SQLServer中构建类似的函数,但不可能在标量函数中使用SELECT

我需要的是得到像

INSERT INTO FacSales (SumaryID, InvoiceID, InvoiceDate
                    , ProductID, SaleValue, CustomerID, VendorID)
SELECT AutoNumber(sale.VendorID, sale.CustomerID, sale.ProductID)
     , sale.InvoiceID
     , sale.SaleDate
     , details.ProductID
     , etc, etc, etc.
SQL Server内部是否有执行此操作的“本机”函数? 或者,有没有一种方法可以使用过程/函数来构建它

谢谢。

你可以用

返回结果集分区内的行的排名,不带 排名中的任何差距。行的秩是一加上行的数目 排在所讨论行之前的不同等级

结果:

ID          VendorID    CustomerID  ProductID   AutoNumber
----------- ----------- ----------- ----------- --------------------
1           1           2           3           1
2           1           2           3           1
3           1           2           4           2
4           1           2           3           1

我想你在找我

使用此sql函数,您可以按所需的所有字段进行分区和排序

SELECT ROW_NUMBER() OVER(PARTITION BY sale.VendorID, sale.CustomerID, sale.ProductID ORDER BY sale.VendorID, sale.CustomerID, sale.ProductID)
 , sale.InvoiceID
 , sale.SaleDate
 , details.ProductID FROM table

您基本上需要一个键值存储。有很多方法可以做到这一点

这里有一个可能的解决办法。它使用存储过程

但是,您没有说明这些值是无限期保留的,还是仅用于一次调用。此示例演示如何无限期地执行此操作

通过小心地使用临时表,可以将其修改为用于单个呼叫或连接。如果不是呼叫或连接,则需要根据该计划清理
autoNumber.autoNumber
表和
autoNumber.NextAutoNumber

-- Create the table, sequence and sproc
-- Create a schema to hold our autonumber table and sequence
CREATE SCHEMA autoNumber
GO

-- Create a sequence.  This just gives us a new number when ever we want.
-- This could be replaced with an identity column.
CREATE SEQUENCE autoNumber.NextAutoNumber AS [bigint]
 START WITH 1
 INCREMENT BY 1 
 NO CACHE 
GO

-- Create a table to hold the auto number key value pairs.
CREATE TABLE autoNumber.AutoNumber(KeyValue varchar(255), Number bigint)
go

-- This is the stored procedure that actually does the work of getting the autonumber
CREATE PROCEDURE autoNumber.GetAutoNumber @KeyValue varchar(255), @AutoNumber bigint = -1 output  AS
BEGIN
    DECLARE @Number bigint = null

    -- See if we already have an autonumber created for this keyvalue
    -- If we do, then set @Number to that value
    SELECT  @Number = autoNum.Number
    FROM    autoNumber.AutoNumber autoNum
    WHERE   autoNum.KeyValue = @KeyValue

    IF (@Number is null)
    BEGIN
        -- If @Number was not changed, then we did not find one
        -- in the table for this @KeyValue.  Make a new one
        -- and insert it.
        SET @Number = NEXT VALUE FOR autonumber.NextAutoNumber

        INSERT INTO autoNumber.AutoNumber ( KeyValue, Number)
        VALUES (@KeyValue, @Number)
    END

    -- Return our number to the caller.
    -- This uses either an output parameter or a select.
    IF (@AutoNumber = -1)
    BEGIN
        select @Number        
    END ELSE
    BEGIN
        set @AutoNumber = @Number    
    END
END
GO
-- End Create

-- Testing with "select"
EXEC autoNumber.GetAutoNumber 'Name 900'
EXEC autoNumber.GetAutoNumber 'Name 300'
EXEC autoNumber.GetAutoNumber 'Name 001'
EXEC autoNumber.GetAutoNumber 'Name 900'

-- Testing with output parameter
DECLARE @AutoNumber bigint
EXEC autoNumber.GetAutoNumber 'Name 900', @AutoNumber OUTPUT
SELECT @AutoNumber
EXEC autoNumber.GetAutoNumber 'Name 300', @AutoNumber OUTPUT
SELECT @AutoNumber
EXEC autoNumber.GetAutoNumber 'Name 001', @AutoNumber OUTPUT
SELECT @AutoNumber
EXEC autoNumber.GetAutoNumber 'Name 900', @AutoNumber OUTPUT
SELECT @AutoNumber

-- End Testing

-- Clean up 
DROP PROCEDURE autoNumber.GetAutoNumber
GO 

DROP TABLE autoNumber.AutoNumber
GO

drop SEQUENCE autoNumber.NextAutoNumber

DROP SCHEMA autoNumber
GO 
-- End Cleanup

最接近SQL Server的是函数

您可以使用它来计算任意数量列的哈希值,例如

SELECT CHECKSUM( 'abc', 123, 'zxc' )
UNION ALL
SELECT CHECKSUM( 'abc', 124, 'zxc' )
UNION ALL
SELECT CHECKSUM( 'abc', 123, 'zxc' )
输出:

-----------
53066784
53066832
53066784

嗨,米凯尔。非常感谢…我不知道这个函数。它将在其他问题上发挥作用。但是在这种情况下,它不能帮助我,因为目标表是由多个源插入的。假设我收到来自7个部门的销售数据,一名销售人员可以在其中的多个部门中进行操作。这样,我的第一组数据可能有3000行。之后,我收到一个8000行的集合。在结果/目标表中,参数{供应商、客户、产品}第一次在3000行内的1357中排名,但与8000行相比,排名将不同。您可以建议另一种方式,Mikael?@RicardoIldefonso您可以创建一个表,其中标识列作为主键,所有其他列作为候选键,并使用该表作为与表示相同数据的整数一起使用的所有列之间的映射。当然,服务器需要额外的工作(更多的查询)来维护这个表。嗨,Alex。非常感谢。出于同样的原因,我在上面写过,这种排名不能应用于这个特殊的问题。请问您是否有其他建议?我想我们需要更多关于您计划如何使用此功能的详细信息。在你的问题中,你刚刚发布了一个问题,这确实让我得到了这个答案。您是否计划由向表中添加数据的多个程序调用存储过程?我还猜自动编号必须考虑到以前自动生成的值?嗨,Alex。我想要一个返回要插入到表中的值的函数。GetAutonum('Ricardo','555.444.333.22','Londrina','Brasil')。。。请看,每次使用相同的参数调用函数时,它都可以返回相同的值来表示该集合。通过这种方式,我可以生成强键,用一个小整数替换一组长字符串。这个函数可以用一个表进行中继,在这个表中args将被保留。目标是获得一个函数来完成两个任务:1。搜索并查找>返回现有ID;2.搜索但不查找>插入新的参数集,然后返回新的ID。如果我正确理解您的要求,sql server中没有本机函数可以执行此操作。要实现您想要做的事情,您确实需要创建一个自定义函数和一个表来保存数据。您是否需要该函数在许多上下文中可用(使用不同的参数类型),或者参数的顺序和类型总是相同的?谢谢您,Vacano。这个建议的问题是,我需要在使用SELECT时插入记录及其生成的键。@RicardoIldefonso-您是否仅限于一条语句?或者您可以先做一个设置语句吗?(我认为这可以通过两种说法来实现)
-----------
53066784
53066832
53066784