SQL Server:创建函数

Posted

技术标签:

【中文标题】SQL Server:创建函数【英文标题】:SQL Server : create function 【发布时间】:2012-05-10 15:27:58 【问题描述】:

我在尝试创建一个可以调用以生成 32 个字符的随机 ID 的函数时遇到了一些麻烦。我让它在查询编辑器中工作,但我的理解是,要在多行结果中生成它,并伴有表中的现有数据,我必须创建一个函数并调用它。这是我的代码:

CREATE FUNCTION [dbo].[Func_Gen_OID] (@NewOID varchar(32))
RETURNS VARCHAR(32) AS
BEGIN

DECLARE @Length int = 32
DECLARE @Output varchar(32)
DECLARE @counter smallint
DECLARE @RandomNumber float
DECLARE @RandomNumberInt tinyint
DECLARE @CurrentCharacter varchar(1)
DECLARE @ValidCharacters varchar(255)
SET @ValidCharacters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
DECLARE @ValidCharactersLength int
SET @ValidCharactersLength = len(@ValidCharacters)
SET @CurrentCharacter = ''
SET @RandomNumber = 0
SET @RandomNumberInt = 0
SET @Output = ''

SET NOCOUNT ON

SET @counter = 1

WHILE @counter < (@Length + 1)

BEGIN

        SET @RandomNumber = Rand()
        SET @RandomNumberInt = Convert(tinyint, ((@ValidCharactersLength - 1) * @RandomNumber + 1))

        SELECT @CurrentCharacter = SUBSTRING(@ValidCharacters, @RandomNumberInt, 1)

        SET @counter = @counter + 1

        SET @Output = @Output + @CurrentCharacter

RETURN @Output
END

感谢您的所有帮助!

【问题讨论】:

只是问,但为什么不使用默认为 newid() 的唯一标识符。它不是字母数字,但保证是唯一的并且非常随机。 【参考方案1】:

用这个代替 RAND() 函数:

create view ViewRandomNumbers 
as 
   select rand( ) as Number 
go 

【讨论】:

准确,但有一个较旧的答案解释了为什么这是必要的。【参考方案2】:

我猜你看到了这个错误:

Invalid use of a side-effecting operator 'rand' within a function.

您不能直接在用户定义的函数中使用 RAND()(您需要一个视图作为中介)。在这种情况下,RAND 无论如何都会为查询的每一行返回相同的值,因为您没有指定不同的种子(对函数的每次调用都不同)。 如果你想将其余的逻辑封装在函数中,你需要从别处传递一个随机生成的值,可能通过 CHECKSUM() 和 NEWID() 生成。

这个SQL Server Central thread中提到了一些可能性

【讨论】:

谢谢大家,我的做法完全错了。我结合使用视图和 NEWID() 来完成创建新视图所需的操作:SELECT REPLACE(CONVERT(varchar(36), NEWID()), '-', '') AS OID跨度> 【参考方案3】:

我看到了两个问题:

    您在 while 循环中返回 @Output。 您不需要输入参数,因为您没有在函数内部使用它

【讨论】:

以上是关于SQL Server:创建函数的主要内容,如果未能解决你的问题,请参考以下文章

sql server表值函数和视图如何一起使用

sql server 中如何查看自定义函数的源代码?

如何创建 SQL Server 函数以返回 int?

创建函数 SQL-Server 语法不正确

sql server 中的自定义函数应该如何调用?

创建“部分”窗口函数以更新 SQL Server 中的数据