2010-02-02 16 views
9

का उपयोग करके फ़ंक्शन बनाना I मुझे यह त्रुटि मिल रही है: कोई विचार?नया आईडी()

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

मैं MS-SQL Server 2005 के साथ काम कर रहा हूं। यहाँ T-SQL कथन है:

Create Function [dbo].[GetNewNumber]() 
RETURNS int 
AS 
BEGIN 

    Declare @code int 

    set @code = (SELECT CAST(CAST(newid() AS binary(3)) AS int)) 

    RETURN (@code) 
END 

उत्तर

8

समारोह आप NewID का उपयोग करते हैं नहीं है, लेकिन इस के आसपास काम किया जा सकता है।

Create View vwGetNewNumber 
as 
Select Cast(Cast(newid() AS binary(3)) AS int) as NextID 

Create Function [dbo].[GetNewNumber] () RETURNS int 
AS 
BEGIN 
Declare @code int 
Select top 1 @code=NextID from vwGetNewNumber 
RETURN (@code) 
END 

फिर आप योजना के अनुसार select dbo.[GetNewNumber]() का उपयोग कर सकते हैं।

+0

मैं एक ही नंबर के बारे में चिंता करना चाहिए दो बार उत्पन्न किया जा रहा है या क्या खगोलीय संभावनाएं हैं ??? –

+0

वे संभावनाओं के दायरे से बाहर नहीं हैं, केवल 100 मिलियन नंबर उपलब्ध हैं, जो पूरी तरह यादृच्छिक मौके से किए जाते हैं। जन्मदिन की समस्या सिद्धांत से एक मैच की संभावना आपके अपेक्षा से जल्द ही आ जाएगी। – Andrew

+0

+1, अच्छा कामकाज। यद्यपि यह रक्षात्मक कोडिंग हो सकता है, लेकिन इस मामले में 'शीर्ष 1' अनावश्यक लगता है और बिना किसी धीमे गति से धीमा है। –

10

आप किसी फ़ंक्शन के भीतर NEWID() का उपयोग नहीं कर सकते हैं।

Create Function [dbo].[GetNewNumber](@newid UNIQUEIDENTIFIER ) 
RETURNS int 
AS 
BEGIN 

    Declare @code int 

    set @code = (SELECT CAST(CAST(@newid AS binary(3)) AS int)) 

    RETURN (@code) 
END 

और चाहते इसे कहते:

SELECT dbo.GetNewNumber(NEWID()) 
2

करता

एक सामान्य तरीके को (मेरे अनुभव में, यह अधिक की जरूरत GETDATE के लिए हो गया है()) में इसे पारित करने के लिए है इसे फ़ंक्शन कॉल के साथ किया जाना है? जब भी मैं इस कार्यक्षमता की जरूरत है, मैं तो बस का उपयोग करें:

checksum(newid()) 

यह ऋणात्मक संख्याओं उत्पन्न होगा - अगर वे सकारात्मक होना चाहिए, तो आप इस्तेमाल कर सकते हैं

abs(checksum(newid())) 
संबंधित मुद्दे