2012-09-14 7 views
5

में varbinary के रूप में संग्रहीत फ़ाइलों को संलग्न करता है। मेरे पास sp_send_dbmail का उपयोग करके संलग्नक के रूप में क्वेरी परिणाम भेजने से संबंधित दो भाग प्रश्न हैं।sp_send_dbmail डेटाबेस

समस्या 1: केवल मूल .txt फ़ाइलें खुल जाएंगी। कोई अन्य प्रारूप जैसे .pdf या .jpg दूषित हैं।

समस्या 2: एकाधिक अनुलग्नक भेजने का प्रयास करते समय, मुझे एक फ़ाइल मिलती है जिसमें सभी फ़ाइल नाम एक साथ चिपके रहते हैं।

मैं SQL सर्वर 2005 चल रहा हूँ और मैं एक मेज अपलोड किए गए दस्तावेज़ भंडारण है:

CREATE TABLE [dbo].[EmailAttachment](
[EmailAttachmentID] [int] IDENTITY(1,1) NOT NULL, 
[MassEmailID] [int] NULL, -- foreign key 
[FileData] [varbinary](max) NOT NULL, 
[FileName] [varchar](100) NOT NULL, 
[MimeType] [varchar](100) NOT NULL 

मैं भी मानक ईमेल सामान के साथ एक MassEmail तालिका है। एसक्यूएल भेजें मेल स्क्रिप्ट यहां है। संक्षिप्तता के लिए, मैंने बयान घोषित कर दिया है।

while ((select count(MassEmailID) from MassEmail where status = 20)>0) 
begin 
    select @MassEmailID = Min(MassEmailID) from MassEmail where status = 20 
    select @Subject = [Subject] from MassEmail where MassEmailID = @MassEmailID 
    select @Body = Body from MassEmail where MassEmailID = @MassEmailID 

    set @query = 'set nocount on; select cast(FileData as varchar(max)) from Mydatabase.dbo.EmailAttachment where MassEmailID = '+ CAST(@MassEmailID as varchar(100)) 

    select @filename = '' 
    select @filename = COALESCE(@filename+ ',', '') +FileName from EmailAttachment where MassEmailID = @MassEmailID 

exec msdb.dbo.sp_send_dbmail  
    @profile_name = 'MASS_EMAIL', 
    @recipients = '[email protected]', 
    @subject = @Subject, 
    @body [email protected], 
    @body_format ='HTML', 
    @query = @query, 
    @query_attachment_filename = @filename, 
    @attach_query_result_as_file = 1, 
    @query_result_separator = '; ', 
    @query_no_truncate = 1, 
    @query_result_header = 0; 

update MassEmailset status= 30,SendDate = GetDate() where MassEmailID = @MassEmailID 
end 

मैं डेटाबेस से फ़ाइलों को सफलतापूर्वक पढ़ने में सक्षम हूं इसलिए मुझे पता है कि बाइनरी डेटा दूषित नहीं है।

.txt फ़ाइलें केवल तब पढ़ती हैं जब मैंने FilaData को वर्चर में डाला था। लेकिन स्पष्ट रूप से मूल शीर्षलेख खो गए हैं। यह ध्यान देने योग्य भी है कि अटैचमेंट फ़ाइल आकार मूल फ़ाइलों से अलग हैं। यह अनुचित एन्कोडिंग के कारण भी सबसे अधिक संभावना है। तो मुझे आशा है कि संग्रहीत मिमटाइप का उपयोग करके फाइल हेडर बनाने का कोई तरीका है, या बाइनरी डेटा में फ़ाइल हेडर शामिल करने का कोई तरीका है?

मुझे पिछले कुछ मानकों के मूल्यों में भी भरोसा नहीं है, और मुझे पता है कि कोलेसस बिल्कुल सही नहीं है, क्योंकि यह पहले फ़ाइल नाम को अल्पविराम से प्रीपेड करता है। लेकिन अच्छा दस्तावेज खोजने के लिए लगभग असंभव है। कृपया सहायता कीजिए!

उत्तर

6

मुझे नहीं लगता कि आप सीधे SQL से बाइनरी डेटा भेजने में सक्षम होंगे। few posts out there हैं जो इस समस्या के बारे में बात करते हैं। Microsoft documentation से क्वेरी पर एक टेक्स्ट वापसी टेक्स्ट फ़ाइल के रूप में स्वरूपित की जाती है। बाइनरी को हेक्साडेसिमल के रूप में स्वरूपित किया गया है। जैसा कि आपने इंगित किया है कि किसी भी फ़ाइल को दूषित करता है जो टेक्स्ट दस्तावेज़ नहीं है।

मुझे लगता है कि आप जो भी करने की कोशिश कर रहे हैं वह अभी भी पूरा कर सकता है हालांकि फ़ाइल सिस्टम में बाइनरी डेटा निर्यात करने के लिए पहले using BCP द्वारा और फिर इसे भेजने के लिए उपलब्ध पारंपरिक फ़ाइल अनुलग्नक विधियों के माध्यम से इसे वापस आयात करना।

तो ऐसा कुछ। (अवधारणा केवल - अवांछित कोड)

DECLARE @OutputFileAndPath VarChar(500) = '\\Log_Files\MyFile.pdf ' 
DECLARE @sql VarChar(8000) 

SELECT @sql = 'BCP "SELECT MyFile FROM [dbo].[MyTable] 
    WHERE PrimaryKey = 12345" queryout ' + @OutputFileAndPath + 
     ' -S MyServer\MyInstance -T -fC:\Documents.fmt' 

/* you could use a generic format file that would cover most formats */ 

EXEC xp_cmdshell @sql, NO_OUTPUT; 

while ((select count(MassEmailID) from MassEmail where status = 20)>0) 
begin 
    select @MassEmailID = Min(MassEmailID) from MassEmail where status = 20 
    select @Subject = [Subject] from MassEmail where MassEmailID = @MassEmailID 
    select @Body = Body from MassEmail where MassEmailID = @MassEmailID 


    exec msdb.dbo.sp_send_dbmail  
     @profile_name = 'MASS_EMAIL', 
     @recipients = '[email protected]', 
     @subject = @Subject, 
     @body [email protected], 
     @body_format ='HTML', 
     @file_attachments = @OutputFileAndPath /* i.e. \\Log_Files\MyFile.pdf */ 

    update MassEmailset status= 30,SendDate = GetDate() where MassEmailID = @MassEmailID 
end  
+0

आपकी प्रतिक्रिया के लिए धन्यवाद। ऐसा लगता है कि यह काम कर सकता है, लेकिन सुरक्षा प्रतिबंध xp_cmdshell को चलाने से मना करते हैं, खासकर उपयोगकर्ता अपलोड की गई फ़ाइलों के साथ। ऐसा लगता है कि मुझे एक अलग दृष्टिकोण लेना होगा। –

+0

इस मुद्दे पर कोई भाग्य। –

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