PDA

View Full Version : توابع فایل در SQL



m_reza
یک شنبه 08 خرداد 1384, 19:53 عصر
سلام
نحوه باز و بسته کردن ، خواندن ،‌ نوشتن و کلا کار با فایل چگونه است ؟ به عنوان مثال نتیجه یک query ساده را چگونه در یک Text File ذخیره کنیم. ( به کمک Transact SQL ) و یا در مثال زیر چگونه محتویات یک فایل XML را به متغیر @xmldoc نسبت دهیم ؟



declare @idoc int
declare @xmldoc varchar(1000)
set @xmldoc= ??

exec sp_xml_preparedocument @idoc OUTPUT, @xmldoc

insert into test select * from openxml(@IDOC , '/root/employees')
with (firstname varchar(30),
lastname varchar(30))

exec sp_xml_removedocument @idoc

:thnx:

AminSobati
یک شنبه 08 خرداد 1384, 20:27 عصر
دوست عزیزم،
محتویات فایل XML میتونه توسط کلاینت خونده بشه و توسط پارامتر برای SP پاس بشه (منظور همون XMLDOC@ که عنوان کردین)
در مورد خروجی گرفتن به Text File میبایست از دستور BCP استفاده کنین. این یک Command Prompt Utility هستش که توسط xp_cmdshell میشه در TSQL هم ازش استفاده کرد.
موفق باشید

titbasoft
یک شنبه 08 خرداد 1384, 20:33 عصر
با اجازه استاد
یک روش دومی هم وجود داره که یه کم استفاده ازش دردسر داره ولی اون استفاده از sp_OACreate و ساختن یک نمونه از Scripting.FileSystemObject است. یک راهنمائی:
http://www.barnamenevis.org/forum/viewtopic.php?t=26306&highlight=file
از متدهای opentextfile و read استفاده کنید.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/jsobjfilesystem.asp

titbasoft
یک شنبه 08 خرداد 1384, 20:45 عصر
BCP
:strange: :strange: :strange: :strange: :strange: عجب چیزیه. متاسفانه باید بگم تا حالا اصلا بهش دقت نکرده بودم.

حالا یک سوال برای انتقال حجم زیاد دیتا کدوم بهتر جواب می ده BCP یا OPENXML و استفاده از INSERT INTO table

majid_afra222
یک شنبه 08 خرداد 1384, 22:29 عصر
سلام
همونطور که دوستان گفتند bcp قدرت بسیار زیادی داره٬‌و یکی از بهترین امکانات اون هم اینه که می شه برنامه نویسیش کرد.
در مورد سرعت هم اینکه برای انتقال 30 هزار رکورد به اکسل٬ با برنامه نویسی bcp من اطلاعات رو تو کمتر از 5 ثانیه از داخل برنامه ام انتقال دادم.
در مورد مقایسه هم تا حالا مقایسه شون نکردم. :oops:

AminSobati
یک شنبه 08 خرداد 1384, 23:33 عصر
در حقیقت BCP و OPENXML با هم قابل مقایسه نیستند. چون BCP اصلا فرمت XML رو برای خواندن اطلاعات نمیشناسه ولی این دقیقا کاریه که OPENXML انجام میده. از طرفی، OPENXML مستقیما از فایل که روی دیسک قرار گرفته اطلاعات رو نمیگیره ولی BCP برای همین منظور ساخته شده.
sp_OACreate کارهای زیادی میتونه برای ما انجام بده ولی ترجیحا زمانی ازش استفاده میکنیم که برای هدف ما، هیچ ابزار معادلی در بین ابزارهای SQL Server وجود نداشته باشه. چون Initialize کردن COM میتونه Cost زیادی داشته باشه.
از لحاظ سرعت، BULK INSERT بالاترین سرعت رو داره، بعدش BCP و بعد DTS. البته BULK INSERT فقط از Text File به SQL Server اطلاعات رو وارد میکنه. اما چون شرکتهای زیادی مثلا از Main Frame به صورت Text File اطلاعات حجیم دریافت میکنن و باید این اطلاعات وارد SQL Server بشه، BULK INSERT هنوز جایگاه قابل توجهی داره(با وجود اینکه فقط یک طرفه اطلاعات رو جا به جا میکنه)
---------------------------------------------------------------------------------------------------------
TIP: یادتون نره که در BCP میتونین یک Query به همراه FOR XML بدین تا در کوتاهترین زمان، جدول یا هر گزارشی رو به فرمت XML روی دیسک ذخیره کنین!

titbasoft
دوشنبه 09 خرداد 1384, 09:36 صبح
فقط می تونم بگم متاسفم چون ماژول انتقال دیتام رو با استفاده از پارامتر پاس شده به SP و openxml نوشتم و تموم شد رفت. انشاء ا... برای دفعه بعد. :cry:

m_reza
دوشنبه 09 خرداد 1384, 20:00 عصر
ضمن تشکر از توجه دوستان


TIP: یادتون نره که در BCP میتونین یک Query به همراه FOR XML بدین تا در کوتاهترین زمان، جدول یا هر گزارشی رو به فرمت XML روی دیسک ذخیره کنین!

با توجه به نکته شما و همچنین راهنمای SQL کد زیر را نوشتم ، که اشکال دارد. لطفا تصحیح بفرمایید.


exec master..xp_cmdshell bcp "select * from northwind.dbo.Employees for xml auto" queryout
test1.txt -U"xx" -P"xx"

البته از BCP در Command Prompt استفاده کردم ،‌ اما فقط فرمت Table را در فایل ذخیره می کند نه نتیجه یک Query را.


محتویات فایل XML میتونه توسط کلاینت خونده بشه و توسط پارامتر برای SP پاس بشه (منظور همون XMLDOC@ که عنوان کردین)
مظنورتون از محتویات فایل XML میتونه توسط کلاینت خونده بشه چیست؟ لطفا یک مثال عملی بزنید.

AminSobati
سه شنبه 10 خرداد 1384, 00:06 صبح
من این رو انجام دادم و مشکل نداشت:

exec master..xp_cmdshell 'bcp "select * from northwind.dbo.Employees for xml auto" queryout c:\test1.txt -T -c -C raw'
که البته شما میتونین به جای T- همون نام کاربری و کلمه عبور رو قرار بدین..

مظنورتون از محتویات فایل XML میتونه توسط کلاینت خونده بشه چیست؟ لطفا یک مثال عملی بزنید.
دوست عزیزم منظور اینه که مثلا نرم افزار شما که با VB نوشتین یک فایل XML رو باز کنه و بخونه و محتویات XML رو به عنوان یک پارامتر برای SP بفرسته. فرض بر اینه که شما SP رو از قبل نوشتین و آمادست که با دریافت XML اون رو پردازش کنه.

m_reza
سه شنبه 10 خرداد 1384, 16:46 عصر
البته کد من یک اشکال کوچولو داشت و اونم این بود که قبل از bcp باید یک quotation قرار می گرفت. به هر حال از توجه شما بسیار ممنونم.