Я написал эту функцию, которая генерирует случайные числа с плавающей точкой и обновляет таблицу, но я получаю эту ошибку:
Сообщение 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:
Exec dbo.Update_Driver_Position '##Temp'
Select * From ##Temp