我必须在查询结果中插入一个假列,这是表值函数的返回值。此列数据类型必须是唯一标识符。最好的方法(我认为......)是使用newid()
函数。问题是,我不能在这种类型的函数中使用newid()
:
Invalid use of side-effecting or time-dependent operator in 'newid()' within a function.
答案 0 :(得分:92)
这是一个聪明的解决方案:
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
答案 1 :(得分:17)
您可以将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())
答案 2 :(得分: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
答案 3 :(得分:-3)
您可以使用ROW_NUMBER函数:
选择
(ROW_NUMBER()OVER(ORDER BY recordID))作为RowNumber,
recordID,
fieldBla1
FROM tableName