newid () внутри функции сервера sql - PullRequest
52 голосов
/ 21 апреля 2009

Мне нужно вставить поддельный столбец в результате запроса, который является возвращаемым значением функции табличного значения. Этот тип данных столбца должен быть уникальным идентификатором. Лучший способ (я думаю ...) - использовать функцию newid(). Проблема в том, что я не могу использовать newid() внутри функции такого типа:

Invalid use of side-effecting or time-dependent operator in 'newid()' within a function.

Ответы [ 4 ]

94 голосов
/ 22 апреля 2009

вот умное решение:

create view getNewID as select newid() as new_id

create function myfunction ()
returns uniqueidentifier
as begin
   return (select new_id from getNewID)
end

что я не могу взять кредит. я нашел это здесь: http://omnibuzz -sql.blogspot.com / 2006/07 / доступа к-недетерминирована-functions.html

-don

17 голосов
/ 13 сентября 2012

Вы можете передать NEWID () в качестве параметра вашей функции.

CREATE FUNCTION SOMEIDFUNCTION
(
    @NEWID1 as varchar(36), @NEWID2 as varchar(36)
)
RETURNS varchar(18)
AS
BEGIN
    -- Do something --
    DECLARE @SFID varchar(18)
    SELECT @SFID = 'DYN0000000' + LOWER(LEFT(@NEWID1,4)) + LEFT(@NEWID2,4) 
    RETURN @SFID
END
GO

Вызовите функцию следующим образом;

SELECT dbo.SOMEIDFUNCTION(NewID(),NewID())
3 голосов
/ 21 апреля 2009

используйте его по умолчанию вместо

create table test(id uniqueidentifier default newsequentialid(),id2 int)

insert test(id2) values(1)

select * from test

NB. Я использовал newsequentialid () вместо newid (), поскольку newid () будет вызывать разбиение страниц, поскольку оно не является последовательным, см. Здесь: Простой код, демонстрирующий разницу между Newid и Newsequentialid

0 голосов
/ 21 апреля 2009

Вы можете использовать функцию ROW_NUMBER:

ВЫБРАТЬ
(ROW_NUMBER () OVER (ORDER BY recordID)) как RowNumber,
recordID,
fieldBla1
FROM tableName

Найти больше информации на http://msdn.microsoft.com/pt-br/library/ms186734.aspx

...