【问题标题】:Default random 10 character string value for SQL Server columnSQL Server 列的默认随机 10 个字符串值
【发布时间】:2015-07-20 13:42:06
【问题描述】:

我的表 [guests] 中有一个列 rndm。现在,对于表格的字段Default value or Binding,每当插入新行时,我想自动将一个10个字符的随机字符串作为默认值插入到该列中。

这个随机字符串可能不包含特殊字符,只能包含来自a-zA-Z0-9 的字符。实现这一目标的最佳方法是什么?

明确一点:我不想在我的 .NET 代码中生成这个随机字符串,我希望它在 SQL Server 中生成。而且我想将此字符串生成直接粘贴到表的字段Default value or Binding 中,而不是单独的SQL 语句。因此,例如,将getdate() 粘贴到Default value or Binding 字段中时,它会起作用。

【问题讨论】:

    标签: sql-server random default-value sql-server-2014


    【解决方案1】:
    SELECT SUBSTRING(REPLACE(CONVERT(varchar, NEWID()), '-', ''), 1, 10)
    

    【讨论】:

    • 我无法将您的代码直接粘贴到表格的Default value or Binding 字段中。我该怎么做?
    • 一个简短的段落,甚至是一两句话的解释,都会让这个答案成为一个很好的答案。
    • @Flo - 在没有 SELECT 的情况下尝试它(即只有嵌套函数)。整个语句是一个示例 T-SQL 语句,它将在查询窗口中显示结果。
    • 我必须指定 varchar 的长度,然后这个命令对我有用;我只想要随机列中的 1 个字符:substring(replace(CONVERT([varchar](36),newid()),'-',''),(1),(1))
    【解决方案2】:

    扩展 Deigo Garbar 已经提出的建议。

    如果要将表达式用作表中的默认值,则需要将此表达式放入函数中。

    但问题是 UDF 函数不允许你在其中使用 NEWID() 函数,它会抱怨不能在 UDF bla bla 中使用非确定性函数......

    一种解决方法是首先创建一个视图,该视图只需调用此表达式,然后在您的函数中使用该视图,然后将该函数用作您的表的默认值。

    查看

    CREATE VIEW dbo.vw_Function_Base
    AS
    SELECT substring(replace(convert(varchar(100), NEWID()), '-', ''), 1, 10) AS Rand_Value
    

    功能

    CREATE FUNCTION dbo.fn_getRandom_Value()
    RETURNS VARCHAR(10)
    AS
    BEGIN
      DECLARE @Rand_Value VARCHAR(10);
    SELECT @Rand_Value = Rand_Value
    FROM vw_Function_Base
    
      RETURN @Rand_Value;
    END
    

    现在您可以将此函数用作表格中的默认值。

    测试

    CREATE TABLE SomeTest_Table
     ( ID        INT
     , RandValue VARCHAR(10) DEFAULT dbo.fn_getRandom_Value()
     )
    GO
    
     INSERT INTO SomeTest_Table(ID)
     VALUES (1)
    GO
    
     SELECT * FROM SomeTest_Table
    

    重要提示

    我不相信这部分 GUID 值总是唯一的,所以要小心。

    【讨论】:

    • 谢谢!但是,当我将此fn_getRandom_Value()fn_getRandom_Value 粘贴到表字段Default Value or Binding 中时,SQL Server Management Studio 会直接将其替换为N'fn_getRandom_Value'...所以将其设为字符串。我怎样才能防止这种情况发生?
    • 自己编写 t-sql 不要指望 Management Studio 来完成你的工作 :)
    • 也许我没有清楚地解释自己:) 我想为此列使用默认值,而不必通过 INSERT 语句插入该值。就像我会在该字段中添加 newid()getdate() 一样。我会用截图更新我的帖子。
    • 我完全明白你的意思,我所说的只是使用 t-sql 来创建或更改表定义,SSMS 只是做一些次要的工作。无论如何输入默认值([dbo].[fn_getRandom_Value]())
    • 谢谢。这几乎可以工作。看起来您的示例仅使用大写字符而没有小写?
    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2016-06-21
    相关资源
    最近更新 更多