代码之家  ›  专栏  ›  技术社区  ›  Haoest

带有自动生成数据的SQL Server列

  •  0
  • Haoest  · 技术社区  · 16 年前

    我有一个客户表,我的要求是添加一个新的varchar列,该列在每次创建新客户时自动获得一个随机的唯一值。

    我想写一个随机字符串的SP,然后检查并重新生成字符串是否已经存在。但是,要将SP集成到客户记录创建过程中,需要在代码级别使用事务性SQL,我希望避免这种情况。

    请帮忙?

    编辑: 我应该强调一下,varchar的长度必须是5个字符,数值介于1000和99999之间,如果数字小于10000,请在左侧填充0。

    6 回复  |  直到 16 年前
        1
  •  3
  •   roman m    16 年前

    如果必须是varchar,可以将uniqueidentifier强制转换为varchar。

    要获取随机唯一标识符,请执行以下操作 NewId()

    以下是你如何铸造的:

    CAST(NewId() as varchar(36))
    

    编辑

    根据您对@brannon的评论:

    你是说你的记录永远不会超过99k条?如果是这样,只需将您的pk设置为标识列,在其中输入1000,并在业务逻辑中注意“0”左填充。

        2
  •  1
  •   dkretz    16 年前

    这个问题给了我同样的感觉,当用户不告诉我他们想做什么,或者为什么,他们只想告诉我怎么做。

    “Random”和“Unique”是相互冲突的要求,除非您创建一个序列列表,然后从中随机选择,删除所选的值。

    但这是为了解决什么问题呢?

        3
  •  1
  •   Michael K. Campbell    16 年前

    对于您的编辑/更新,听起来您需要的是一个自动增量和一些填充。

    下面是一种使用假表的方法,然后添加一个标识列(假设您没有标识列),该列从1000开始,然后使用计算列为您提供一些填充,使所有内容都按您的要求工作。

    CREATE TABLE Customers (
        CustomerName varchar(20) NOT NULL
    )
    GO
    
    INSERT INTO Customers 
    SELECT 'Bob Thomas' UNION
    SELECT 'Dave Winchel' UNION
    SELECT 'Nancy Davolio' UNION
    SELECT 'Saded Khan'
    GO
    
    ALTER TABLE Customers
        ADD CustomerId int IDENTITY(1000,1) NOT NULL
    GO 
    
    ALTER TABLE Customers
        ADD SuperId AS right(replicate('0',5)+ CAST(CustomerId as varchar(5)),5) 
    GO
    
    SELECT * FROM Customers
    GO
    
    DROP TABLE Customers
    GO
    
        4
  •  1
  •   marc_s    16 年前

    我认为迈克尔的自动增量回答应该很好——你的客户会得到“01000”,然后是“01001”,然后是“01002”,等等。

    如果您希望或必须使其更加随机,在这种情况下,我建议您创建一个包含所有可能值的表,从“01000”到“99999”。插入新客户时,使用一种技术(例如随机化)从该表中选择一个现有行(仍然可用的客户ID池),然后使用它,并将其从表中删除。

    随着时间的推移,任何其他事情都会变得非常糟糕。假设您已经用完了90%或95%的可用客户ID,尝试随机地查找剩下的少数可能性中的一个,可能会导致几乎无穷无尽的重试“这是采取的吗?是->尝试下一个”。

    马克

        5
  •  1
  •   Brannon    16 年前

    随机字符串数据需要是某种格式吗?如果不是,为什么不使用唯一标识符?

    insert into Customer ([Name], [UniqueValue]) values (@Name, NEWID())
    

    或使用 NEWID() 作为列的默认值。

    编辑: 我同意@rm,在数据库中使用一个数值,并在代码中处理到字符串(带填充等)的转换。

        6
  •  0
  •   eKek0    16 年前

    试试这个:

    ALTER TABLE Customer ADD AVarcharColumn varchar(50) 
    CONSTRAINT DF_Customer_AVarcharColumn DEFAULT CONVERT(varchar(50), GETDATE(), 109)
    

    它返回一个最长为毫秒的日期和时间,在大多数情况下wich就足够了。

    你…吗 真的? 需要唯一的值?