मैं बाहरी आवेदन के साथ उपयोग किए जाने पर एक तालिका मूल्यवान फ़ंक्शन पर कुछ अजीब व्यवहार मार रहा हूं। मेरे पास एक साधारण इनलाइन फ़ंक्शन है जो किसी अन्य तालिका में पंक्ति के आधार पर कुछ सरल गणना देता है। जब टीवीएफ के लिए इनपुट मान हार्ड-कोड वाले स्केलर होते हैं, तो कोई पंक्ति वापस नहीं होती है। जब मैं एक ही स्केलर लेता हूं और सीटीई में उनमें से एक पंक्ति बना देता हूं, तो उन्हें क्रॉस एपली का उपयोग करके कॉलम के रूप में खिलाएं, कोई परिणाम सेट नहीं। जब मैं बाहरी आवेदन के साथ ऐसा करता हूं, तो मुझे 1 पंक्ति (अपेक्षित के रूप में) मिलती है, लेकिन आउटपुट कॉलम में से दो NULL
और अन्य दो NOT NULL
हैं। बीओएल के आधार पर, यह OUTER APPLY
के साथ नहीं होना चाहिए। क्या यह एक उपयोगकर्ता त्रुटि है? मैंने इस मुद्दे को प्रदर्शित करने के लिए एक सरल संस्करण लिखा था।बाहरी रिटर्निंग कॉलम अप्रत्याशित रूप से न्यूल करें जब कोई मिलान
--Test set-up
CREATE FUNCTION dbo.TVFTest
(
@keyID INT,
@matchValue1 MONEY,
@matchValue2 MONEY
)
RETURNS TABLE AS RETURN
(
WITH TestRow
AS (SELECT @keyID AS KeyID,
@matchValue1 AS MatchValue1,
@matchValue2 AS MatchValue2)
SELECT KeyID,
MatchValue1,
MatchValue2,
CASE
WHEN MatchValue1 <> MatchValue2
THEN 'Not equal'
ELSE 'Something else'
END AS MatchTest
FROM TestRow
WHERE MatchValue1 <> MatchValue2
)
GO
क्वेरी
WITH Test AS
(
SELECT 12 AS PropertyID,
$350000 AS Ap1,
350000 AS Ap2
)
SELECT LP.*
FROM Test T
OUTER APPLY dbo.TVFTest
(
T.PropertyID,
T.Ap1,
T.Ap2
) LP;
परिणाम
+-------+-------------+-------------+-----------+
| KeyID | MatchValue1 | MatchValue2 | MatchTest |
+-------+-------------+-------------+-----------+
| 12 | 350000.00 | NULL | NULL |
+-------+-------------+-------------+-----------+
अपेक्षा के अनुरूप Cross Apply
रिटर्न नहीं पंक्तियों का उपयोग करना। सीटीई को हटाने और इनलाइन स्थिरांक का उपयोग करने से कोई पंक्ति नहीं आती है।
--Scalars, no row here...
SELECT LP.*
FROM dbo.TVFTest
(
12,
$350000,
350000
) LP;
मेरा मानना है कि यह है क्योंकि आप अपने TVF में एक फिल्टर है '' कहां MatchValue1 इस प्रकार है (और 8605 मूल रूप से एक ही पेड़ को दर्शाता है।) है! = MatchValue2'' और आपके प्रत्येक परीक्षण मिलान मानों की आपूर्ति करता है। तो यह कोई मैच नहीं देता है। उस स्थिति को हटाएं और मुझे लगता है कि आपको अपेक्षित परिणाम मिलेंगे। ... एनवीआर दिमाग, आपके प्रश्न का गलत व्याख्या कर सकता है ... – cocogorilla
आउटपुट आवेदन को समारोह के खिलाफ बाहरी जुड़ाव के समान व्यवहार करना चाहिए। मैंने 0 परिणाम लौटने के लिए यह उदाहरण चुना है। लेकिन, टीवीएफ द्वारा लौटाए गए सभी कॉलम पूर्ण होना चाहिए। पहला नहीं है। मेरा सवाल है - क्यों? क्या मेरे कोड में कोई बग है या यह कुछ और है? – CDC
आप बिल्कुल सही हैं ... वह WEIRD है ... आप वास्तव में इसे पांच कॉलम डंप करने के लिए प्राप्त कर सकते हैं ...किसी कारण से, matchid टीवीपी उपनाम के माध्यम से आ रहा है ... और मैं नहीं देख सकता कि यह क्यों चाहिए। – cocogorilla