web-dev-qa-db-ja.com

SQLサーバー関数内のnewid()

クエリの結果に偽の列を挿入する必要があります。これは、テーブル値関数の戻り値です。この列のデータ型は一意の識別子である必要があります。最善の方法(と思う...)はnewid()関数を使用することです。問題は、このタイプの関数内でnewid()を使用できないことです:

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

これが賢い解決策です。

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

-ドン

96
Don Dickinson

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())
18
Daniel de Zwaan

代わりにデフォルトとして使用してください

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

insert test(id2) values(1)

select * from test

NB newid()はシーケンシャルではないのでページ分割を引き起こすため、newid()の代わりにnewsequentialid()を使用しました。ここを参照してください: NewidとNewsequentialidの違いを示す簡単なコード

4
SQLMenace