Sql 创建将接受Rand()种子设定的UDF
尝试创建以下函数时出现以下错误: 错误1 SQL80001:“返回选择强制转换(RAND)”附近的语法不正确( @偏移量*@seed)*@max as int)+1' 我做错了什么Sql 创建将接受Rand()种子设定的UDF,sql,sql-server,tsql,visual-studio-2012,Sql,Sql Server,Tsql,Visual Studio 2012,尝试创建以下函数时出现以下错误: 错误1 SQL80001:“返回选择强制转换(RAND)”附近的语法不正确( @偏移量*@seed)*@max as int)+1' 我做错了什么 CREATE FUNCTION [dbo].[fn_RandomInt]( @offset int, @seed int, @max int ) RETURNS INT AS RETURN SELECT CAST( RAND( @offset * @seed )* @max as int ) + 1 是否
CREATE FUNCTION [dbo].[fn_RandomInt]( @offset int, @seed int, @max int )
RETURNS INT
AS
RETURN
SELECT CAST( RAND( @offset * @seed )* @max as int ) + 1
是否可以创建一个UDF,该UDF将接受Rand()函数的种子?创建函数的正确语法为:
CREATE FUNCTION [dbo].[fn_RandomInt]( @offset int, @seed int, @max int )
RETURNS INT
AS
begin
RETURN CAST( RAND( @offset * @seed )* @max as int ) + 1
end
GO
但是你会得到一个错误:
Msg 443,16级,状态1,程序fn_RandomInt,第5行无效使用
函数中的副作用运算符“rand”
这是因为您不能在UDF中放置不确定的函数。由于某种原因,您的函数可以使用使用不确定函数的视图或过程,因此您可以创建一个带有输出变量的存储过程,该变量返回rand
函数的值并使用它。您也可以只将rand
函数的输出发送到函数并使用它。比如:
select dbo.fn_RandomInt(10, rand(@seed), 20)
此外,如果您试图让函数返回@offset和@max之间的随机数,那么您的公式将不起作用。你会想要更像:
CAST(@offset + RAND(@seed) * (@offset-@max+1) as int)
您可以得到它无法使用此语法的原因,这将导致此错误
CREATE FUNCTION [dbo].[fn_RandomInt]( @offset int, @seed int, @max int )
RETURNS INT
AS
BEGIN
DECLARE @v_offset INT, @v_seed INT, @v_max INT, @result INT
SELECT @result = CAST(RAND( @v_offset * @v_seed ) * @v_max as int ) + 1
RETURN @result
END
它会给你这个错误-
Msg 443,16级,状态1,程序RandFn,第7行
在函数中使用副作用运算符“rand”无效
您可以在这里寻求帮助,但由于您希望提供RAND()参数,因此无论哪种方式,您都需要做一些不同的事情,这样视图的想法就行不通了
关于语法错误,请参阅文档。即使你解决了这个问题,你也会发现其他问题。这是不可能的。您建议采用哪种解决方法?是否不需要
begin
和end
子句?重复?