2011-08-10 5 views
9

टी-एसक्यूएल के रैंकिंग कार्यों का उपयोग करते समय, रैंकिंग मान वाले कॉलम शून्य है।टी-एसक्यूएल रैंकिंग मूल्य क्यों शून्य कॉलम लौटाते हैं?

आप यह देख सकते हैं जब परिणाम सेट के एक दृश्य बनाने:

CREATE VIEW v 
AS 
    SELECT Name 
    , ListPrice 
    , RANK() OVER (ORDER BY ListPrice DESC) AS [Rank] 
    , DENSE_RANK() OVER (ORDER BY ListPrice DESC) AS [DenseRank] 
    , ROW_NUMBER() OVER (ORDER BY ListPrice DESC) AS [RowNumber] 
FROM Production.Product 

इस दृश्य के लिए sp_help निष्पादित इंगित करता है कि रैंकिंग कार्यों का उपयोग कर स्तंभों व्यर्थ कर रहे हैं:

EXEC sp_help 'v' 

Column_name (...) | Nullable 
---------------...-+------------+ 
...   (...) | ... 
Rank   (...) | Yes 
DenseRank  (...) | Yes 
RowNumber  (...) | Yes 

कौन सा हालत का कारण होगा NULL वापस करने के लिए एक रैंकिंग समारोह?

+1

AFAIK दृश्यों में गणना किए गए कॉलम को बेस टेबल में गणना वाले कॉलम से अलग तरीके से नहीं माना जाता है। [इस पृष्ठ के निचले हिस्से में उस और शून्यता पर कुछ टिप्पणियां हैं।] (Http://msdn.microsoft.com/en-us/library/ms191250.aspx) –

उत्तर

8

एक दृश्य में प्रत्येक गणना/फ़ंक्शन आधारित कॉलम शून्य दिखता प्रतीत होता है। उदा .:

create view v1 
as 
    select OBJECT_ID,OBJECT_ID * 1 as obj2 from sys.objects 
go 
EXEC sp_help 'v1' 

इंगित करता है कि object_id नल नहीं है, लेकिन है कि obj2 है, भले ही यह तुच्छता से नमूदार है कि अगर object_id कभी नहीं अशक्त हो सकता है, और न ही कर सकते हैं obj2

एक ही रास्ता मैं के बारे में पता (यकीन नहीं करता है, तो यह है कि क्या तुम सच में की तलाश कर रहे है) नल नहीं होने के लिए प्रकट करने के लिए एक स्तंभ के लिए मजबूर करने, एक ISNULL में लपेट के लिए है:

create view v2 
as 
    select OBJECT_ID,ISNULL(OBJECT_ID * 1,0) as obj2 from sys.objects 
go 
EXEC sp_help 'v2' 

दिलचस्प बात यह है इस कुछ स्थानों पर जहां COALESCE बजाय ISNULL उपयोग नहीं कर सकते में से एक है:

create view v3 
as 
    select OBJECT_ID,COALESCE(OBJECT_ID * 1,0) as obj2 from sys.objects 
go 
EXEC sp_help 'v3' 

v3 जैसा दिखता है v1

संबंधित मुद्दे