2009-04-21 28 views
43

Tôi phải chèn một cột giả vào kết quả của một truy vấn, đó là giá trị trả về của hàm bảng giá trị. Loại dữ liệu cột này phải là số nhận dạng duy nhất. Cách tốt nhất (tôi nghĩ ...) là sử dụng hàm newid(). Vấn đề là, tôi không thể sử dụng newid() bên trong loại chức năng:newid() bên trong chức năng máy chủ sql

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

Chức năng không được phép chứa các toán tử không xác định. Bạn có thể đăng định nghĩa hàm của mình không? –

Trả lời

3

sử dụng nó như một mặc định thay vì

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

insert test(id2) values(1) 

select * from test 

NB Tôi đã từng newsequentialid() thay vì newid() kể từ newid () sẽ gây ra pagesplits vì nó không phải là tuần tự, xem tại đây: Some Simple Code To Show The Difference Between Newid And Newsequentialid

+1

... chỉ khi chỉ số nhóm được dựa trên nó ... –

+1

có, không may một số người làm cho nó một PK mà không nhận ra nó là cụm .... tôi tin rằng tôi đã thấy nhiều trường hợp như vậy – SQLMenace

-3

Bạn có thể sử dụng chức năng ROW_NUMBER:

CHỌN
(ROW_NUMBER() OVER (ORDER BY recordID)) như RowNumber,
recordID,
fieldBla1
TỪ tableName

Tìm thêm thông tin tại http://msdn.microsoft.com/pt-br/library/ms186734.aspx

+2

Ông muốn một kiểu dữ liệu của uniqueidentifier không phải int – SQLMenace

12

Bạn có thể vượt qua NEWID() như một tham số để hàm của bạn.

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 

Gọi hàm như thế này;

SELECT dbo.SOMEIDFUNCTION(NewID(),NewID()) 
Các vấn đề liên quan