58

我必须在查询结果中插入一个假列,这是一个表值函数的返回值。此列数据类型必须是唯一标识符。最好的方法(我认为......)是使用newid()函数。问题是,我不能newid()在这种类型的函数中使用:

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

4 回答 4

111

这是一个聪明的解决方案:

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

-大学教师

于 2009-04-22T03:15:04.910 回答
20

您可以将 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())
于 2012-09-12T23:57:53.540 回答
5

将其用作默认值

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

insert test(id2) values(1)

select * from test

注意我使用 newsequentialid() 而不是 newid() 因为 newid() 会导致分页,因为它不是顺序的,请参见此处:一些简单的代码来显示 Newid 和 Newsequentialid 之间的区别

于 2009-04-21T13:16:50.263 回答
-6

您可以使用 ROW_NUMBER 函数:

SELECT
(ROW_NUMBER() OVER (ORDER BY recordID) ) as RowNumber ,
recordID,
fieldBla1
FROM tableName

在http://msdn.microsoft.com/pt-br/library/ms186734.aspx找到更多信息

于 2009-04-21T13:19:28.010 回答