如何以特定格式创建唯一的序列号字符串?
How to create unique serial number strings in a particular format?
我想用一些序列号填充我的 SQL 服务器 table 以提供给其他人。它们实际上只是与人们的电子邮件地址相关的 UUID。
我可以看到 ColdFusion 提供了 CreateUUID
功能,但它生成的 ID 格式为:
xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx
这是遵循 8-4-4-16 结构。我只想要一些简单的东西,比如 3-3-3 格式,它对于 table(即每个客户)中的每一行都是唯一的。
解决这个问题的最佳方法是什么?我不介意在 SQL 或 ColdFusion 中执行此操作,但我不确定如何让它们中的任何一个为我自动生成这样的字符串。 SQL 服务器具有 NEWID()
函数,但它再次生成了不是我想要的格式的大字符串。
有什么方法可以强制 SQL 的 NewID()
或 CF 的 CreateUUID
创建具有 3-3-3 格式的独特连续剧吗?
你可以使用这样的东西,它会生成你正在寻找的格式:
DECLARE @Value VARCHAR(100)
SELECT @Value = NEWID()
SELECT @Value
SELECT SUBSTRING(@Value,1,3) + '-' + SUBSTRING(@Value,10,3) + '-' + SUBSTRING(@Value,30,3)
序列号应该是唯一的。保证您的电子邮件地址具有唯一序列号的一种方法是设置 IDENTITY 列的格式。如果您的电子邮件 table 还没有 IDENTITY 列,请添加一个。假设它被命名为 Email_ID,那么下面的表达式将为您提供一个 XXX-XXX-XXX 形式的字符串,保证对电子邮件 table.
是唯一的
SELECT
STUFF(STUFF(RIGHT('000000000' + CAST(Email_ID AS VARCHAR(9)), 9), 4, 0, '-'), 8, 0, '-')
FROM
EmailTable
您可以创建一个随机的 9 个字符的字符串,然后检查它在您的 customer/people table 中是否唯一。如果不是 -> 创建一个新的随机字符串并再次检查。 (循环直到它是唯一的)。
我为此创建了 2 个函数,一个生成 9 个字符的随机字符串,另一个使用第一个函数创建一个字符串,然后检查 table 以查看该字符串是否存在于特定列。
随机字符串函数:
<cffunction name="makeRandomString" returnType="string" output="false">
<cfargument name="codeLength" type="numeric" required="no" default="9">
<cfset var chars = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ">
<cfset var length = codeLength>
<cfset var result = "">
<cfset var i = "">
<cfset var char = "">
<cfscript>
for(i=1; i <= length; i++) {
char = mid(chars, randRange(1, len(chars)),1);
result&=char;
}
</cfscript>
<cfreturn result>
</cffunction>
创建随机字符串并确保它在特定 table 的特定列中唯一的函数:
<cffunction name="createUniqueCode" returnType="string" output="false">
<cfargument name="tableName" type="string" required="yes">
<cfargument name="columnName" type="string" required="yes">
<cfargument name="codeLength" type="numeric" required="no" default="9">
<cfset ordercode = 0>
<cfset ordercodecheck = 0>
<cfloop condition="ordercodecheck eq 0">
<cfset ordercode = #makeRandomString('#codeLength#')#>
<cfquery name="findCode" datasource="#application.datasource#">
select #kolomNaam# from #tableName# where #columnName# = '#ordercode#'
</cfquery>
<cfif findCode.recordcount eq 0>
<cfset ordercodecheck = 1>
</cfif>
</cfloop>
<cfreturn ordercode>
</cffunction>
现在您可以循环 x-times 并生成 x 个始终唯一的随机代码。 (以下示例中的"myColumnName" 是包含唯一代码的列的名称)
<cfloop from="1" to="100" index="i">
<cfset newCode = createUniqueCode(tableName='myTableName',columnName='myColumnName')>
<!--- insert what to do with new code here (f.e. an insert query) the "newCode" variable holds the new unique code. --->
</cfloop>
希望对您有所帮助。
干杯
我想用一些序列号填充我的 SQL 服务器 table 以提供给其他人。它们实际上只是与人们的电子邮件地址相关的 UUID。
我可以看到 ColdFusion 提供了 CreateUUID
功能,但它生成的 ID 格式为:
xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx
这是遵循 8-4-4-16 结构。我只想要一些简单的东西,比如 3-3-3 格式,它对于 table(即每个客户)中的每一行都是唯一的。
解决这个问题的最佳方法是什么?我不介意在 SQL 或 ColdFusion 中执行此操作,但我不确定如何让它们中的任何一个为我自动生成这样的字符串。 SQL 服务器具有 NEWID()
函数,但它再次生成了不是我想要的格式的大字符串。
有什么方法可以强制 SQL 的 NewID()
或 CF 的 CreateUUID
创建具有 3-3-3 格式的独特连续剧吗?
你可以使用这样的东西,它会生成你正在寻找的格式:
DECLARE @Value VARCHAR(100)
SELECT @Value = NEWID()
SELECT @Value
SELECT SUBSTRING(@Value,1,3) + '-' + SUBSTRING(@Value,10,3) + '-' + SUBSTRING(@Value,30,3)
序列号应该是唯一的。保证您的电子邮件地址具有唯一序列号的一种方法是设置 IDENTITY 列的格式。如果您的电子邮件 table 还没有 IDENTITY 列,请添加一个。假设它被命名为 Email_ID,那么下面的表达式将为您提供一个 XXX-XXX-XXX 形式的字符串,保证对电子邮件 table.
是唯一的SELECT
STUFF(STUFF(RIGHT('000000000' + CAST(Email_ID AS VARCHAR(9)), 9), 4, 0, '-'), 8, 0, '-')
FROM
EmailTable
您可以创建一个随机的 9 个字符的字符串,然后检查它在您的 customer/people table 中是否唯一。如果不是 -> 创建一个新的随机字符串并再次检查。 (循环直到它是唯一的)。
我为此创建了 2 个函数,一个生成 9 个字符的随机字符串,另一个使用第一个函数创建一个字符串,然后检查 table 以查看该字符串是否存在于特定列。
随机字符串函数:
<cffunction name="makeRandomString" returnType="string" output="false">
<cfargument name="codeLength" type="numeric" required="no" default="9">
<cfset var chars = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ">
<cfset var length = codeLength>
<cfset var result = "">
<cfset var i = "">
<cfset var char = "">
<cfscript>
for(i=1; i <= length; i++) {
char = mid(chars, randRange(1, len(chars)),1);
result&=char;
}
</cfscript>
<cfreturn result>
</cffunction>
创建随机字符串并确保它在特定 table 的特定列中唯一的函数:
<cffunction name="createUniqueCode" returnType="string" output="false">
<cfargument name="tableName" type="string" required="yes">
<cfargument name="columnName" type="string" required="yes">
<cfargument name="codeLength" type="numeric" required="no" default="9">
<cfset ordercode = 0>
<cfset ordercodecheck = 0>
<cfloop condition="ordercodecheck eq 0">
<cfset ordercode = #makeRandomString('#codeLength#')#>
<cfquery name="findCode" datasource="#application.datasource#">
select #kolomNaam# from #tableName# where #columnName# = '#ordercode#'
</cfquery>
<cfif findCode.recordcount eq 0>
<cfset ordercodecheck = 1>
</cfif>
</cfloop>
<cfreturn ordercode>
</cffunction>
现在您可以循环 x-times 并生成 x 个始终唯一的随机代码。 (以下示例中的"myColumnName" 是包含唯一代码的列的名称)
<cfloop from="1" to="100" index="i">
<cfset newCode = createUniqueCode(tableName='myTableName',columnName='myColumnName')>
<!--- insert what to do with new code here (f.e. an insert query) the "newCode" variable holds the new unique code. --->
</cfloop>
希望对您有所帮助。
干杯