考虑这个SQL Server代码:
CREATE FUNCTION dbo.CreateRandomDateTime ()
RETURNS DateTime
AS BEGIN
DECLARE @DateFrom DATETime = '2012-01-01'
DECLARE @DateTo DATeTime = '2012-06-30'
DECLARE @DaysRandom Int= 0
DECLARE @MillisRandom Int=0
select @DaysRandom= DATEDIFF(day,@DateFrom,@DateTo)
SELECT @DaysRandom = ROUND(((@DaysRandom -1) * RAND()), 0)
--get random millis
SELECT @MillisRandom = ROUND(((99999999) * RAND()), 0)
SELECT @DateTo = DATEADD(day, @DaysRandom, @DateTo)
SELECT @DateTo = DATEADD(MILLISECOND, @MillisRandom, @DateTo)
RETURN @DateTo
END
我想创建一个返回随机DateTime的函数,但是当我执行代码时,我得到:
Msg 443,Level 16,State 1,Procedure CreateRandomDateTime,Line 9
无效使用副作用运算符' rand'在一个函数内。Msg 443,Level 16,State 1,Procedure CreateRandomDateTime,Line 12
无效使用副作用运算符' rand'在一个函数内。Msg 8116,Level 16,State 1,Procedure CreateRandomDateTime,Line 14
对于dateadd函数的参数2,参数数据类型datetime无效。Msg 8116,Level 16,State 1,Procedure CreateRandomDateTime,Line 15
对于dateadd函数的参数2,参数数据类型datetime无效。
但是当我在没有body函数的情况下运行代码时,我得到一个随机的日期时间,所以我觉得这个函数做错了。
我哪里出错了?
答案 0 :(得分:0)
您可以在创建函数之外移动RAND()运算符,只需将其作为参数传递:
CREATE FUNCTION dbo.CreateRandomDateTime (
@RAND FLOAT
)
RETURNS DateTime
AS BEGIN
DECLARE @DateFrom DATETime = '2012-01-01'
DECLARE @DateTo DATeTime = '2012-06-30'
DECLARE @DaysRandom Int= 0
DECLARE @MillisRandom Int=0
select @DaysRandom= DATEDIFF(day,@DateFrom,@DateTo)
SELECT @DaysRandom = ROUND(((@DaysRandom -1) * @RAND), 0)
--get random millis
SELECT @MillisRandom = ROUND(((99999999) * @RAND), 0)
SELECT @DateTo = DATEADD(day, @DaysRandom, @DateTo)
SELECT @DateTo = DATEADD(MILLISECOND, @MillisRandom, @DateTo)
RETURN @DateTo
END
SELECT DBO.CREATERANDOMDATETIME(RAND())