是否有相当于 QlikView 的 AutoNumber() 的 SQL Server 函数



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

在 QlikView 中,它用于根据发送到函数的参数生成一个数字。在此处查看其文档:https://help.qlik.com/en-US/qlikview/November2017/Subsystems/Client/Content/Scripting/CounterFunctions/autonumber.htm

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

   AutoNumber('Name 900') -> returns 1
   AutoNumber('Name 300') -> returns 2
   AutoNumber('Name 001') -> returns 3
   AutoNumber('Name 900') -> returns 1 ... again 

并且因为该参数已经在自动编号的实习生列表中

我试图在SQL Server中构建一些类似的内容,但不可能在标量函数中使用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内部,是否有执行此操作的"本机"函数?或者,有没有办法使用过程/函数构建它?

谢谢。

您可以使用

DENSE_RANK(Transact-SQL(

返回结果集分区中行的排名,不 排名中的任何差距。一行的秩是 1 加上 在相关行之前的不同等级。

declare @T table
(
  ID int identity,
  VendorID int,
  CustomerID int,
  ProductID int
);
insert into @T values
(1, 2, 3),
(1, 2, 3),
(1, 2, 4),
(1, 2, 3);
select sale.ID,
       sale.VendorID,
       sale.CustomerID,
       sale.ProductID,
       dense_rank() over(order by sale.VendorID, 
                                  sale.CustomerID, 
                                  sale.ProductID) as AutoNumber
from @T as sale
order by sale.ID;

结果:

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

你基本上想要一个键值存储。 有很多方法可以制作一个。

这是一个可能的解决方案。 它使用存储过程。

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

可以通过谨慎使用临时表将其修改为单个调用或连接。 如果不是呼叫或连接,则需要按照该计划清理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最接近的是CHECKSUM函数。

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

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

输出:

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

我想你正在寻找ROW_NUMBER((。

使用此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

相关内容

  • 没有找到相关文章

最新更新