【问题标题】:newid() inside sql server functionsql server 函数中的 newid()
【发布时间】:2014-07-08 19:02:33
【问题描述】:

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

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

【问题讨论】:

  • 函数不允许包含非确定性运算符。你能发布你的函数定义吗?

标签: sql-server function newid


【解决方案1】:

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

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

-不要

【讨论】:

    【解决方案2】:

    您可以将 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】:

      改为默认使用

      create table test(id uniqueidentifier default newsequentialid(),id2 int)
      
      insert test(id2) values(1)
      
      select * from test
      

      注意,我使用 newsequentialid() 而不是 newid() 因为 newid() 会导致分页,因为它不是连续的,请参见此处:Some Simple Code To Show The Difference Between Newid And Newsequentialid

      【讨论】:

      • 是的,不幸的是,有些人在没有意识到它是集群的情况下将其作为 PK....相信我,我见过很多这样的例子
      【解决方案4】:

      您可以使用 ROW_NUMBER 函数:

      选择
      (ROW_NUMBER() OVER (ORDER BY recordID) ) 作为 RowNumber ,
      记录ID,
      fieldBla1
      FROM 表名

      http://msdn.microsoft.com/pt-br/library/ms186734.aspx了解更多信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 2020-09-25
        相关资源
        最近更新 更多