我必須在查詢結果中插入一個假列,這是一個表值函數的返回值。此列數據類型必須是唯一標識符。最好的方法(我認爲...)是使用newid()
函數。問題是,我無法使用newid()
這種類型的函數內:sql服務器函數內的newid()
Invalid use of side-effecting or time-dependent operator in 'newid()' within a function.
我必須在查詢結果中插入一個假列,這是一個表值函數的返回值。此列數據類型必須是唯一標識符。最好的方法(我認爲...)是使用newid()
函數。問題是,我無法使用newid()
這種類型的函數內:sql服務器函數內的newid()
Invalid use of side-effecting or time-dependent operator in 'newid()' within a function.
這裏有一個聰明的解決方案:
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/accessing-non-deterministic-functions.html
-don
使用它作爲一個缺省代替
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
...只有當聚集索引是基於它... – 2009-04-21 13:17:41
是的,不幸的是有些人沒有意識到它是聚集在一起的....相信我我見過很多這樣的實例 – SQLMenace 2009-04-21 13:20:25
您可以使用ROW_NUMBER函數:
選擇
(ROW_NUMBER()OVER(ORDER BY的recordId))作爲ROWNUMBER,
的recordId,
fieldBla1
FROM表名
查找更多信息在http://msdn.microsoft.com/pt-br/library/ms186734.aspx
您可以通過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())
函數不允許包含非確定性運算符。你可以發佈你的函數定義嗎? – 2009-04-21 13:15:25