【发布时间】: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 语句中,让它为每条记录生成一个新值。