2009-04-21 19 views
43

Muszę wstawić fałszywą kolumnę na wynik zapytania, który jest zwracaną wartością funkcji wartości tabeli. Ten typ danych kolumny musi być unikalnym identyfikatorem. Najlepszym sposobem (jak sądzę ...) jest użycie funkcji newid(). Problem polega na tym, że nie można używać newid() wewnątrz tego typu funkcji:newid() wewnątrz funkcji serwera sql

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

Funkcje nie mogą zawierać niedeterministycznych operatorów. Czy umieścisz swoją definicję funkcji? –

Odpowiedz

3

używać go jako domyślny zamiast

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

insert test(id2) values(1) 

select * from test 

NB użyłem newsequentialid() zamiast NEWID() od newid () spowoduje pagesplits ponieważ nie jest sekwencyjny, zobacz tutaj: Some Simple Code To Show The Difference Between Newid And Newsequentialid

+1

... tylko wtedy, gdy indeks klastrowy jest oparty na nim ... –

+1

tak, niestety niektórzy ludzie robią to PK, nie zdając sobie sprawy, że jest skupiony .... uwierz mi, widziałem wiele takich instancji – SQLMenace

12

można przekazać newID() jako parametr do funkcji.

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 

Wywołanie funkcji w ten sposób;

SELECT dbo.SOMEIDFUNCTION(NewID(),NewID())