2009-08-15 9 views
7

मैं एक दृश्य का उपयोग कर एक ADO.NET इकाई बनाने के लिए एक दृश्य का उपयोग करने की कोशिश कर रहा हूं। हालांकि, उस दृश्य में एक एकल स्तंभ नहीं है जो पूर्ण नहीं है।कॉलम को नज़र में न्यूल के रूप में कैसे इंगित करें?

एक चीज जो मेरे लिए हुई थी, दृश्य के लिए 'प्राथमिक कुंजी' के रूप में उपयोग करने के लिए दृश्य पर एक पूर्ण स्तंभ नहीं बनाना था। यह काम किया, लेकिन क्षेत्र अभी भी न्यूल के रूप में रिपोर्ट किया गया है।

क्या दृश्य कॉलम को रिपोर्ट करने के लिए SQL सर्वर को मजबूर करने या चाल करने का कोई तरीका नहीं है?

की तरह कुछ के रूप में देखें कल्पना कीजिए:

CREATE VIEW vwSample WITH SCHEMABINDING 
AS 
SELECT ID = convert(uniqueidentifier, /* some computed value */) 
     ,Field1 
     ,Field2 
     ,Field3 
    FROM tbSample 

नोट:कह रही है कि मैं इस तरह के काम करते हैं करने के लिए इकाई एक्सएमएल संपादित कर सकते हैं करने से पहले, मैं इस क्योंकि मैं एक बहुत है पूछ रहा हूँ इस तरह से बनाई जाने वाली बड़ी संख्या में इकाइयां बनाई जाएंगी।

+0

क्या आप अपने दृश्य में अनुक्रमिक प्राथमिक कुंजी जोड़ना चाहते हैं? –

+0

एसक्यूएल सर्वर का कौन सा संस्करण? –

+0

यदि डेटा स्वाभाविक रूप से पहचान योग्य नहीं है तो आप इसके लिए प्राथमिक कुंजी क्यों जोड़ना चाहते हैं? मुझे संदेह है कि आप इस नकली प्राथमिक कुंजी का उपयोग करके शामिल होना चाहते हैं ... – pjp

उत्तर

3

मैं अगर यह प्रयास के लायक है पता नहीं है, लेकिन मैं एक समारोह है कि नहीं NULL क्षेत्रों के साथ अस्थायी तालिका रिटर्न परिकलित मान लिए काम करना चाहिए बनाने लगता है। पूर्व।

Create function fnSTestample() 
returns @Test TABLE 
(
    tableId varchar(100) not null 
) 
WITH SCHEMABINDING 
as 
begin 
    insert @Test(tableID) 
    select 'some computed value' from dbo.someTable 
return 
end 

और फिर आप उस फ़ंक्शन को दृश्य में चुनते हैं।

चीयर्स। ,

आप newid() उपयोग करने के लिए अपने आईडी क्षेत्र निर्धारित करने के लिए नहीं करना चाहते हैं, क्योंकि यह हर बार जब आप दृश्य का उपयोग पुनर्गणना किया जाएगा:

+0

मेरी आवश्यकता के अनुसार, यह दृष्टिकोण अद्भुत काम करता है। –

0

उपयोग newid()

CREATE VIEW vwSample WITH SCHEMABINDING 
AS 
SELECT ID = NEWID() 
     ,Field1 
     ,Field2 
     ,Field3 
    FROM tbSample 
+0

क्षमा करें isnull गलत था –

4

सबसे पहले, अपने सवाल का जवाब देने। वास्तव में, डेटा अखंडता सबसे बड़ी समस्या है।

select 
    row_number() over (order by someStaticAndUniqueFieldLikeCreateDate) as ID, 
    Field1, 
    Field2, 
    Field3 
from 
    tblA 
order by 
    someStaticAndUniqueFieldLikeCreateDate 

यह केवल काम करता है अगर आप एक क्षेत्र है कि एक सुसंगत आदेश है कि इस तरह के एक CreateDate क्षेत्र के रूप में नई पंक्तियाँ, संलग्न कर देगा होगा पर ऑर्डर दे रहे हैं। यदि आपके पास यह नहीं है, तो वह आईडी बदल सकती है। अब, अगर आपको केवल इन आईडी को रनटाइम पर चाहिए, और ऐसा कुछ भी नहीं है जो स्थायी रूप से उनसे लिंक हो, row_number केवल आलसी उत्सुक होगा। यदि आपके पास अविश्वसनीय डेटा है, तो विश्वसनीय आईडी फ़ील्ड होने का कोई तरीका नहीं है जब तक कि आप अतिरिक्त तालिका बनाते हैं और इसे पॉप्युलेट करने के लिए ट्रिगर का उपयोग करते हैं।

दूसरा, with schemabinding से सावधान रहें। अगर यह क्लेज के रूप में प्रयोग किया जाता है तो यह खतरनाक है। याद रखें कि जैसे ही आप with schemabinding देखेंगे, आप की अंतर्निहित तालिका की सभी पर स्कीमा को बदल नहीं सकते हैं। इसका अर्थ यह है कि with schemabinding सक्षम सभी दृश्यों को छोड़कर और फिर से जोड़ने के बिना आप varchar(50) कॉलम varchar(100) नहीं बना सकते हैं। हां, आप एक दृश्य को अनुक्रमित कर सकते हैं जो योजनाबद्ध है, लेकिन निश्चित रूप से ट्रेडऑफ हैं जिन्हें लॉक, स्टॉक और बैरल जाने से पहले ध्यान में रखना आवश्यक है।

1

मैंने इसके लिए ISNULL का उपयोग किया। अर्थात।मेरे जैसा कुछ काम करता है:

CREATE VIEW vwSample WITH SCHEMABINDING 
AS 
SELECT ID = ISNULL(uniqueidentifier, /*some computed value */) 
     ,Field1 
     ,Field2 
     ,Field3 
    FROM tbSample