SQL Server 函数错误(我不能在 SQL Server 函数中使用 NewID() 吗?)

Posted

技术标签:

【中文标题】SQL Server 函数错误(我不能在 SQL Server 函数中使用 NewID() 吗?)【英文标题】:SQL Server function error (can't I use NewID() in a SQL Server function?) 【发布时间】:2011-12-18 15:12:10 【问题描述】:

我编写了这个生成随机浮点数并更新表格的函数,但我得到了这个错误:

消息 443,级别 16,状态 1,过程 Update_Driver_Positon,第 30 行 在函数中无效使用副作用运算符“newid”。 消息 443,级别 16,状态 1,过程 Update_Driver_Positon,第 30 行 在函数中无效使用副作用运算符“rand”。 消息 443,级别 16,状态 1,过程 Update_Driver_Positon,第 31 行 在函数中无效使用副作用运算符“newid”。 消息 443,级别 16,状态 1,过程 Update_Driver_Positon,第 31 行 在函数中无效使用副作用运算符“rand”。

我不能在函数中使用newid()Rand() 吗?

这是我的代码:

Create FUNCTION Update_Driver_Positon()
RETURNS  @rtnTable TABLE 
(
    -- columns returned by the function
    DriverID UNIQUEIDENTIFIER NOT NULL,
    UserID numeric(18,0)  NULL,
    Employ_Date Date null,
    Car_Type_ID numeric(18,0),
    is_Active bit null,
    Pos_X numeric(18,3),
    Pos_Y numeric(18,3)
)
AS
BEGIN
declare @maxvalueX int
declare @minvalueX int
declare @maxvalueY int
declare @minvalueY int

declare @X int  
declare @Y int


set @maxvalueX = 3357
set @minvalueX = 273
set @maxvalueY = -320
set @minvalueY = -3096


set @X = ROUND(RAND(CHECKSUM(NEWID())) * (@maxvalueX - @minvalueX),0) + @minvalueX
set @Y = ROUND(RAND(CHECKSUM(NEWID())) * (@maxvalueY - @minvalueY),0) + @minvalueY

Update driver_tbl set pos_x=@x , pos_y=@y 

--This select returns data
insert into @rtnTable
SELECT * FROM driver_tbl 
return
END

我也尝试使用存储过程,但是没有用,假设更新表字段的随机数在每条记录中都是相同的,并且不能多次执行 sp 这是我的 SP:

create Procedure Update_Driver_Position
@TempName Varchar(8000)
As
declare @maxvalueX int
declare @minvalueX int
declare @maxvalueY int
declare @minvalueY int

declare @X int  
declare @Y int


set @maxvalueX = 3357
set @minvalueX = 273
set @maxvalueY = -320
set @minvalueY = -3096


set @X = ROUND(RAND(CHECKSUM(NEWID())) * (@maxvalueX - @minvalueX),0) + @minvalueX
set @Y = ROUND(RAND(CHECKSUM(NEWID())) * (@maxvalueY - @minvalueY),0) + @minvalueY

Update driver_tbl set pos_x=@x , pos_y=@y 

Exec ('
Select *
Into '+@TempName+'
From  dbo.Driver_Tbl
')

和执行代码:

 Exec dbo.Update_Driver_Position '##Temp'
 Select * From ##Temp

【问题讨论】:

您的 proc 将在每条记录中放入相同的值,因为这是您要求它执行的操作。将 rand 语句移动到 update 语句中,让它为每条记录生成一个新值。 【参考方案1】:

您不能在函数中使用其中任何一个。

有一些解决方法(例如,将它们包括在视图定义中并从视图中选择 is 在函数中允许)但我看到您的下一行使用 UPDATE 在函数中也是不允许的,所以您将需要为此使用不同的方法。也许是一个存储过程。

【讨论】:

我也不能用SP。 (更新了我的问题) @rNuǝɹɐ - 这是一个不同的问题,我已经出去了,所以没时间看。【参考方案2】:

使用 RAND 函数创建一个视图。

CREATE VIEW rndView
AS
SELECT RAND() rndResult
GO

使用相同的 VIEW 创建 UDF。

CREATE FUNCTION RandFn()
RETURNS DECIMAL(18,18)
AS
BEGIN
DECLARE @rndValue DECIMAL(18,18)
SELECT @rndValue = rndResult
FROM rndView
RETURN @rndValue
END
GO

现在执行 UDF,它会正常工作并返回随机结果。

SELECT dbo.RandFn()
GO

【讨论】:

以上是关于SQL Server 函数错误(我不能在 SQL Server 函数中使用 NewID() 吗?)的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER(MSSQLSERVER服务不能启动怎么办?

sqlserver2005安装错误

SQL Server 用户定义函数返回表——不能从选择查询中调用它

SQL Server studio 函数变量范围错误

SQL SERVER 2008只能用windows用户登录,不能用SQL SERVER 用户验证登录,很是头疼,希望高手给指点指点

SQL Server 函数在错误的列中返回数据