2012-12-08 12 views
5

मेरी समस्या यह है: मेरे पास SQL ​​Server 2008 (> 1GB) पर बाइनरी (छवि) फ़ील्ड में बड़ी फ़ाइलों को संग्रहीत करने की क्षमता है।मैं विशाल बाइनरी (फ़ाइल) का केवल एक हिस्सा कैसे चुनूं?

यदि मैं नियमित चयन कथन का उपयोग करके पूरी बाइनरी लौटाता हूं, तो क्वेरी मेरे .NET प्रोग्राम और मेरे क्लाइंट ऐप्स के परिणामों को वापस करने के लिए एक मिनट से अधिक समय लेती है। जो मैं खोज रहा हूं वह टीएसक्यूएल कोड है जो लौटाए गए डेटा (शायद 300 एमबी) के आकार को सीमित कर देगा, जिससे मुझे शेष हिस्सों के माध्यम से फिर से चलने और टाइमआउट को रोकने की इजाजत मिल जाएगी।

यह SQL क्वेरी में होना है, डेटा लौटने के बाद प्रसंस्करण में नहीं होना चाहिए।

मैंने सबस्ट्रिंग की कोशिश की है, जो एमएस बाइनरी डेटा के साथ काम करता है, लेकिन मैं वापस लौटा हूं 8000 बाइट अधिकतम है। आखिरी चीज मैंने कोशिश की:

select substring(Package,0,300000000) 'package', ID from rplPackage where ID=0 
--where package is the huge binary stored in a image field 

क्लाइंट ऐप्स की वजह से डेटा स्ट्रीमिंग वास्तव में एक विकल्प नहीं है।

कोई विचार?

+0

आप reecaluate कि क्या फ़ाइलों को संग्रहीत करने के रूप में डेटाबेस Blobs वास्तव में अपनी आवश्यकताओं फिट बैठता है चाहिए: यह सिर्फ फ़ाइलों के रूप में Stroe करने के लिए बेहतर हो सकता है फ़ाइलों और केवल DB में उनके रास्ते और मेटाडाटा स्टोर । अंगूठे का नियम यह है: यदि डीबी फ़ाइल की ** सामग्री ** को "समझ" नहीं देती है, तो उसे बाहर ले जाने पर विचार करें। –

+0

@EugenRieck समझें तर्क के अनुसार, बाइनरी डेटा प्रकार भी नहीं होना चाहिए। – Paparazzi

+0

कुछ उपयोग मामले हैं (गरीब व्यक्ति के साझा एफएस सोचें), लेकिन ओक्यू स्पष्ट रूप से दिखाता है कि बीएलओबी –

उत्तर

0

, FileStream

FILESTREAM Overview

Managing FILESTREAM Data by Using Win32

sqlFileStream.Seek(0L, SeekOrigin.Begin); 

numBytes = sqlFileStream.Read(buffer, 0, buffer.Length); 
+0

ब्लम का एक सही समाधान नहीं है ... इनपुट के लिए धन्यवाद। मैं उस सोमवार को देख लूंगा और देखूंगा कि यह मेरे लिए काम करेगा या नहीं। मैं इस बिंदु पर हताश हूँ। – Brian

+0

क्षमा करें, ब्लम, लेकिन यह काम नहीं करेगा। मैं फाइल सिस्टम से नहीं पढ़ रहा हूँ।क्लाइंट ऐप्स पर डेटा प्रतिकृति को आसान बनाने के लिए फ़ाइलों को डेटाबेस पर रिकॉर्ड के रूप में संग्रहीत किया गया है। जैसा कि मैंने उपरोक्त कहा है, स्ट्रीमिंग काम नहीं करेगा। समाधान को TSQL के भीतर होना आवश्यक है। – Brian

5

ठीक उपयोग करने पर विचार मैं यह समझ से बाहर। ऐसा करने का तरीका सबस्ट्रिंग फ़ंक्शन के साथ है, जो एमएस सटीक रूप से बाइनरी के साथ काम करता है। वे क्या नहीं कहते हैं कि सबस्ट्रिंग केवल 8,000 बाइट लौटाएगी, जो मुझे फेंक देता है।

दूसरे शब्दों में, अगर ब्लॉब डेटा प्रकार छवि है और आप इस का उपयोग करें:

select substring(BlobField,0,100000000) 
from TableWithHugeBlobField 
where ID = SomeIDValue 

--all you'll get is the first 8K bytes (use DataLength function to get the size) 

हालांकि, अगर आप varbinary (अधिकतम) के एक चर घोषित करने और ब्लॉब क्षेत्र डेटा प्रकार varbinary है (अधिकतम) - या कुछ आकार जो आपके लिए उपयोगी हैं - फिर आपके द्वारा घोषित वैरिएबल में आंशिक बाइनरी वापस लाने के लिए सबस्ट्रिंग फ़ंक्शन का उपयोग करें। यह ठीक काम करता है। बस इस तरह:

Declare @PartialImage varbinary(max) 
select @PartialImage = substring(BlobField, 0, 100000000) --1GB 
from TableWithHugeBlobField 
where ID = SomeIDValue 

select DataLength(@PartialImage) -- should = 1GB 

प्रश्न पहले सामने आया था, फ़ाइल डेटा स्टोर करने के लिए SQL का उपयोग क्यों करें? यह एक वैध सवाल है; कल्पना करें कि आपको डेटा को सैकड़ों विभिन्न क्लाइंट डिवाइसों (जैसे iPhones) में फ़ाइलों के रूप में दोहराना पड़ रहा है, प्रत्येक पैकेज दूसरे से अनूठा है क्योंकि अलग-अलग ग्राहकों की अलग-अलग ज़रूरत होती है, फिर फ़ाइल पैकेज को संग्रहीत करना डेटाबेस पर ब्लॉब्स के रूप में प्रोग्राम करना बहुत आसान है क्लाइंट को स्ट्रीम करने के लिए सही पैकेज खोजने के लिए फ़ोल्डर्स के माध्यम से प्रोग्रामेटिक रूप से खोदना होगा।

+2

सबस्ट्रिंग के लिए, पहला बाइट 1 0 0 – DavidsAlias

1

इस का उपयोग करें:

select substring(*cast(Package as varbinary(max))*,0,300000000) 'package', ID 
from rplPackage 
where ID=0 
+0

पर टिप्पणी करने के लिए एक टिप्पणी छोड़कर यह बताने के लिए कि ओपी और भविष्य के किसी भी आगंतुक के लिए प्रश्न का उत्तर क्या फायदेमंद है। – SnareChops

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