PDA

View Full Version : درج در جدول از طریق دستور bulk



saeedhatmi
یک شنبه 21 خرداد 1396, 11:40 صبح
با سلام به همه اساتید محترم
من ی فایل تکس دارم که شامل 100 ها رکورد هستش تلفیقی از عدد و حروف فارسیه حالا از طریق بالک میخوام در جدول درجش کنم هنگامی که از طریق substring میخوام در جدول بریزم قروقاطی میریزه مثلا ستون کد با ی ستون دیگه پر میشه علتشم میدونم به خاطر اون ستون اخر هستش که فارسیه.چطور این مشکلو حل کنم؟
USE [Salary];
GO
/****** Object: StoredProcedure [dbo].[Read_FromBackFile] Script Date: 21/03/1396 11:12:40 ق.ظ ******/
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
ALTER PROCEDURE [dbo].[Read_FromBackFile] -- 'D:\NOPARD950204.txt'

--DECLARE
@Address NVARCHAR(500)
AS
BEGIN



DECLARE @query NVARCHAR(3000);


SET @query = N'



Create table #TempHesabdari1
(
Line NVARCHAR(MAX)
)


BULK INSERT #TempHesabdari1

FROM ''@Address''

WITH ( CODEPAGE = 1256 )



SELECT SUBSTRING(Line, 1, 4) group_code ,
SUBSTRING(Line, 5, 6) Date ,
SUBSTRING(Line, 11, 3) Cause_settlement ,
SUBSTRING(Line, 14, 13) Acc_No ,
SUBSTRING(Line, 27, 15) Mablagh ,
SUBSTRING(Line, 42, 4) range ,
SUBSTRING(Line, 47, 34) title,
-- RTRIM(LTRIM(REPLACE(Line,SUBSTRING(dbo.fn_LeftNume ric(Line),1, 45), ''''))) Title,
row_number() over (order by (select 0) ) Rn

Into #T2
FROM #TempHesabdari1
WHERE LEN(Line) > 0


INSERT INTO [Tbl_BackFile]
(Code_Daste,
Date ,
Cause_settlement ,
Sh_hesab,
Mablagh,
Code_Marhale,
Title


)

select group_code,
Date ,
Cause_settlement ,
Acc_No,
Mablagh,
range,
Title


FROM #T2
where Rn >0






';
SET @query = REPLACE(@query, '@Address', @Address);


--SELECT @query

EXECUTE ( @query);

END;

saeedhatmi
یک شنبه 21 خرداد 1396, 11:41 صبح
بانك صادرات -بازنشستگان کشورى 999996022700303036738730040000000070425001226
بانك صادرات -بازنشستگان کشورى 999996022700303025588920050000000119340011225
سازمان بازنشستگي خراسان جنوبي 993196022701003250372270070000000089440001383
بانك صادرات -بازنشستگان کشورى 999996022700303123066190030000000166306401231
بانك صادرات -بازنشستگان کشورى 999996022700103105266200020000000103422681230
بانك صادرات -بازنشستگان کشورى 999996022700303044555440040000000200164731227
بانك صادرات -بازنشستگان کشورى 999996022700303046285220090000000122705451227
اینم چند خط از فایل تکست که میخوام درجش کنم در جدول

Mahmoud.Afrad
یک شنبه 21 خرداد 1396, 21:50 عصر
هر خط از این اطلاعات با متن فارسی شروع میشه اما شما کوئری را با فرض شروع با اعداد نوشتید. اندیسهایی که در SUBSTRING استفاده کردید را اصلاح کنید.

اگر میتونید در تولید فایل txt ، یک جداکننده استفاده کنید برای مشخص کردن ستونها. در اینصورت راحت تر میتونید اطلاعات رو جدا کنید.
در ضمن اگر در دات نت کار میکنید ، میتونید در برنامه خودتون این جداسازی و بعد درج را انجام بدید.


متن دارای حروف عربی هست که می بایست به فارسی تبدیل کنید.

saeedhatmi
دوشنبه 22 خرداد 1396, 11:36 صبح
در ضمن اگر در دات نت کار میکنید ، میتونید در برنامه خودتون این جداسازی و بعد درج را انجام بدید.

میشه ی مثال بزنین

Mahmoud.Afrad
دوشنبه 22 خرداد 1396, 12:37 عصر
اگر طول عدد ثابت هست ، سلکت به صورت زیر جواب میده
SELECT
SUBSTRING(Line, LEN(Line)-45+1 , 4) group_code ,
SUBSTRING(Line, LEN(Line)-45+5 , 6) Date ,
SUBSTRING(Line, LEN(Line)-45+11 , 3) Cause_settlement ,
SUBSTRING(Line, LEN(Line)-45+14 , 13) Acc_No ,
SUBSTRING(Line, LEN(Line)-45+27 , 15) Mablagh ,
SUBSTRING(Line, LEN(Line)-45+42 , 4) range ,
REPLACE( REPLACE(RTRIM( LTRIM( SUBSTRING( Line, 1, LEN(Line)-45 ) ) ) , N'ي' , N'ی') , N'ك' , N'ک' ) title ,
--RTRIM( LTRIM( REPLACE( Line, SUBSTRING( dbo.fn_LeftNumeric(Line), 1, 45), '''') )) Title,
row_number() over (order by (select 0) ) Rn
--Into #T2
FROM #TempHesabdari1
WHERE LEN(Line) > 0



میشه ی مثال بزنین

لود فایل
https://msdn.microsoft.com/en-us/library/s2tte0y1.aspx
جداسازی
https://msdn.microsoft.com/en-us/library/aka44szs.aspx
درج یکجا
https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx