使用base64进行SQL自动增量

时间:2016-05-04 10:01:19

标签: sql sql-server tsql

我想知道是否可以在MS SQL中创建一个id为base64且自动递增的表?

现在我们可以做这样的事情

create table tb(
     _id int identity(1,1)
)

但是这样的事情呢?

create table tb(
     _id base64 identity(1,1)
)

2 个答案:

答案 0 :(得分:1)

只是概念证明:

  1. 创建功能:

    CREATE FUNCTION [TempFunc] 
    (
        @Id int
    )
    RETURNS nvarchar(max)
    AS
    BEGIN
        DECLARE @Id_Binary varbinary(MAX) = CONVERT(varbinary(64), @Id)
    
        RETURN CAST(N'' AS XML).value('xs:base64Binary(sql:variable("@Id_Binary"))', 'VARCHAR(MAX)') 
    END
    
  2. 创建表格:

    CREATE TABLE Temp (
        Id int IDENTITY(1,1),
        [Id_Base64]  AS (dbo.TempFunc(Id)),
        Value nvarchar(max)
    )
    
  3. 使用:

    INSERT INTO Temp
    VALUES
    (N'aaaa'),
    (N'bbbb'),
    (N'cccc')
    
    SELECT *
    FROM Temp AS t
    
    Id          Id_Base64  Value
    ----------- ---------- ----------
    1           AAAAAQ==   aaaa
    2           AAAAAg==   bbbb
    3           AAAAAw==   cccc
    
  4. 或者,使用NEWSEQUENTIALID()

    CREATE TABLE #Temp(
        Id uniqueidentifier DEFAULT(NEWSEQUENTIALID()),
        Value nvarchar(10)
    )
    
    INSERT INTO #Temp 
    ([Value])
    VALUES
    (N'aaaa'),
    (N'bbbb'),
    (N'cccc')
    
    SELECT *
    FROM #Temp AS t
    
    Id                                   Value
    ------------------------------------ ----------
    A6FD44E0-E611-E611-80E9-001DD8B71C43 aaaa
    A7FD44E0-E611-E611-80E9-001DD8B71C43 bbbb
    A8FD44E0-E611-E611-80E9-001DD8B71C43 cccc
    

答案 1 :(得分:1)

您可以创建视图,而不是计算列:

CREATE TABLE tb(
     _id INT IDENTITY(1,1)
    ,col VARCHAR(10)
);

INSERT INTO tb(col) VALUES ('a'),('b'),('c'),('d');
GO

CREATE VIEW my_view AS
SELECT *
FROM tb t
CROSS APPLY (SELECT CAST(_id AS VARBINARY(MAX))
             FOR XML PATH(''), BINARY BASE64) s(base64_id);
GO             

SELECT * FROM my_view;

LiveDemo

输出:

╔═════╦═════╦═══════════╗
║ _id ║ col ║ base64_id ║
╠═════╬═════╬═══════════╣
║   1 ║ a   ║ AAAAAQ==  ║
║   2 ║ b   ║ AAAAAg==  ║
║   3 ║ c   ║ AAAAAw==  ║
║   4 ║ d   ║ AAAABA==  ║
╚═════╩═════╩═══════════╝
  

和YouTube一样,我在网址中有一个ID,我不希望人们只是递增该ID以便浏览所有项目。与YouTube不同,我没有“万亿”项目

然后base64根本不会保护你。 IDENTITY本质上是增量的,掩盖它很容易克服。