Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建将接受Rand()种子设定的UDF_Sql_Sql Server_Tsql_Visual Studio 2012 - Fatal编程技术网

Sql 创建将接受Rand()种子设定的UDF

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 是否

尝试创建以下函数时出现以下错误:

错误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

是否可以创建一个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
子句?重复?