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服务不能启动怎么办?
SQL Server 用户定义函数返回表——不能从选择查询中调用它
SQL SERVER 2008只能用windows用户登录,不能用SQL SERVER 用户验证登录,很是头疼,希望高手给指点指点