2009-04-21 47 views
43

我必須在查詢結果中插入一個假列,這是一個表值函數的返回值。此列數據類型必須是唯一標識符。最好的方法(我認爲...)是使用newid()函數。問題是,我無法使用newid()這種類型的函數內:sql服務器函數內的newid()

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

函數不允許包含非確定性運算符。你可以發佈你的函數定義嗎? – 2009-04-21 13:15:25

回答

3

使用它作爲一個缺省代替

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

insert test(id2) values(1) 

select * from test 

NB我用NEWSEQUENTIALID()代替NEWID()因爲NEWID( )將導致pagesplits,因爲它是不連續的,在這裏看到:Some Simple Code To Show The Difference Between Newid And Newsequentialid

+1

...只有當聚集索引是基於它... – 2009-04-21 13:17:41

+1

是的,不幸的是有些人沒有意識到它是聚集在一起的....相信我我見過很多這樣的實例 – SQLMenace 2009-04-21 13:20:25

12

您可以通過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())