Ошибка функции SQL Server (нельзя ли использовать NewID () в функции SQL Server?) - PullRequest
0 голосов
/ 18 декабря 2011

Я написал эту функцию, которая генерирует случайные числа с плавающей точкой и обновляет таблицу, но я получаю эту ошибку:

Сообщение 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

Ответы [ 2 ]

2 голосов
/ 18 декабря 2011

Вы не можете использовать ни один из них в функции.

Есть обходные пути (например, включение их в определение представления и выбор из вида разрешено в функции), ноЯ вижу, что ваша следующая строка использует UPDATE, что также запрещено в функции, поэтому вам придется использовать другой подход для этого.Возможно хранимая процедура.

0 голосов
/ 07 декабря 2012

Создать ВИД, используя функцию RAND.

CREATE VIEW rndView
AS
SELECT RAND() rndResult
GO

Создайте UDF, используя тот же VIEW.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...