TSQL:为什么不能在标量值函数中使用 newid()

问题描述 投票:0回答:4

我尝试使用标量值函数实现以下链接,SQL Server 2000 返回错误消息:函数内使用 'newid' 无效。

http://www.bennadel.com/blog/310-Ask-Ben-Getting-A-Random-Date-From-A-Date-Range-In-SQL.htm

有什么办法可以解决这个问题吗?

sql-server t-sql
4个回答
3
投票

在 SQL 2000 中,您不能在其他函数中使用非确定性函数。

执行此操作的最佳方法是在外部查询中使用子查询。无论如何,它的性能都会比标量函数更好,根据我的博客:http://msmvps.com/blogs/robfarley/archive/2009/12/05/dangers-of-begin-and-end.aspx


1
投票

我发现执行此操作的唯一方法是创建一个选择 NEWID() 值的视图,然后在函数内使用此视图。


0
投票

为什么不一直传入NEW_ID()作为参数呢?使用视图有点过分了,恕我直言

ALTER FUNCTION dbo.MyFunc (
    @param1 int, 
    @param2 datetime,
    @GUID uniqueidentifier
)
RETURNS int
AS
....



SELECT dbo.MyFunc (1, '20091221', NEWID())

0
投票

你可以使用这个(在 SQL SERVER 中)

-- ================================================= -- 选择 [dbo].GenerateOTP -- ================================================= 创建函数 [dbo].[生成OTP]( @Newid唯一标识符 ) 返回 VARCHAR(10) 开始

DECLARE @OTP varchar(10) =null

SET @OTP = (SELECT Cast(CAST(CHECKSUM(CAST(@Newid AS varbinary(64))) AS int) % 1000000000 + 10000000000 AS varchar(15)));

return @OTP

结束

您可以调用下面的函数 AS

选择[dbo].生成OTP

© www.soinside.com 2019 - 2024. All rights reserved.