วันพุธที่ 17 เมษายน พ.ศ. 2556

SQL UPDATE using SELECT


sample syntax having TOP3
   UPDATE dbo.tblRptWordWeekly_Paragraph1Sourcemini
  SET d1MinistryName = MinistryName
   ,d1Actual = Actual
   ,d1PActual = pActual
  FROM

  (SELECT   TOP 3 ROW_NUMBER() OVER (ORDER BY  (SUM(Curr_Actual) + SUM(Inv_Actual))/(SUM(Curr_BG) + SUM(Inv_BG)) *100 DESC )  d1Row
,Ministry_Name MinistryName
,SUM(Curr_Actual) + SUM(Inv_Actual) Actual
,(SUM(Curr_Actual) + SUM(Inv_Actual)) / ((SUM(Curr_BG) + SUM(Inv_BG))) * 100   pActual
  FROM   vw_LatestOutputActual_2556
  GROUP BY  Ministry_Name) AS TempTable
  WHERE d1Row=1

It's work not error!!!! 

วันพฤหัสบดีที่ 11 เมษายน พ.ศ. 2556

Store procedure return value


ตอนนี้กำลังหาว่าจะ Return value ยังไง แล้วไปเจอะhttp://www.developerfusion.co.uk/show/91/4/ ดีทีเดียวล่ะ  
 
CREATE PROCEDURE sp_test
AS
Declare @Count nvarchar(max)
Declare @x nvarchar(max)
BEGIN
SET @Count = (SELECT count(AsOf) FROMdbGFMIS.dbo.tblAsOf)
SET @x = @Count
Return @x
END
GO
เบื้องต้นรู้แค่นี้ก่อน เด๋วจะดูต่อว่ามีอะไรมากกว่านี้แค่ไหนอ่ะ

Can’t import excel by Store procedure


เรื่องของเรื่องมีอยู่ว่า จากเดิมที่นกต้องเขียน Store procedure เพื่อ Import excel ใช่ม่ะ
นกก็เขียนปกติ  Openrowset(‘Microsoft.Jet.OLEDB.4.0′,‘Excel 8.0;Database=c:\excel.xls;HDR=Yes’,‘SELECT * FROM [Sheet1$]‘)
Import excel ใช่ม่ะมันก็ใช้งานได้ปกติถ้าใช้กับเครื่องนกเอง และ sc_server หรือ scbackup แต่พอเอาไปใช้อีก server (dbsv02)
ปรากฎว่าไม่ได้เรื่องมี error แดงแจ๋เลย
 
OLE DB provider "Microsoft.jet.OLEDB.4.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.jet.OLEDB.4.0" for linked server "(null)".
 
ตอนแรกนกคิดว่าเป็นเพราะ dbsv02 ไม่ได้ลง excel ปรากฏว่ามันไม่ใช่อ่ะ สาเหตุที่ขึ้น error แบบนี้สำหรับกรณีที่นกเจอคือ
ไฟล์เอกเซลที่นกเซฟเป็นเวอร์ชั่น 2003 หน่ะ คือนกใช้เวอร์ชั่น 2007 ไงแม้จะ save as เป็น 2003 มันก็ยังคงมีปัญหาอยู่
ดังนั้นต้องไป Download Provider ใหม่ก่อนนะ สามารถไปดูได้ที่นี่http://www.microsoft.com/downloads/details.aspx?familyid=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en จากนั้นก็เวลาเรียกใช้ Openrowset แทนที่จะเรียกจาก Excel 8.0 ก็เรียกจาก Excel 12.0 แทนและ
โดยมีตัวอย่างการเรียกแบบนี้นะ Openrowset(‘Microsoft.ACE.OLEDB.12.0′,‘Excel 12.0;Database=c:\excel.xls;HDR=Yes’,‘SELECT * FROM [Sheet1$]‘นกไฮไลน์ตัวที่ต้องเปลี่ยนแล้วล่ะ แค่นี้ก็จะใช้งานได้แล้วนะ
 

Can’t import excel by Store procedure


เรื่องของเรื่องมีอยู่ว่า จากเดิมที่นกต้องเขียน Store procedure เพื่อ Import excel ใช่ม่ะ
นกก็เขียนปกติ  Openrowset(‘Microsoft.Jet.OLEDB.4.0′,‘Excel 8.0;Database=c:\excel.xls;HDR=Yes’,‘SELECT * FROM [Sheet1$]‘)
Import excel ใช่ม่ะมันก็ใช้งานได้ปกติถ้าใช้กับเครื่องนกเอง และ sc_server หรือ scbackup แต่พอเอาไปใช้อีก server (dbsv02)
ปรากฎว่าไม่ได้เรื่องมี error แดงแจ๋เลย
 
OLE DB provider "Microsoft.jet.OLEDB.4.0" for linked server "(null)" returned message "Unspecified error".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "Microsoft.jet.OLEDB.4.0" for linked server "(null)".
 
ตอนแรกนกคิดว่าเป็นเพราะ dbsv02 ไม่ได้ลง excel ปรากฏว่ามันไม่ใช่อ่ะ สาเหตุที่ขึ้น error แบบนี้สำหรับกรณีที่นกเจอคือ
ไฟล์เอกเซลที่นกเซฟเป็นเวอร์ชั่น 2003 หน่ะ คือนกใช้เวอร์ชั่น 2007 ไงแม้จะ save as เป็น 2003 มันก็ยังคงมีปัญหาอยู่
ดังนั้นต้องไป Download Provider ใหม่ก่อนนะ สามารถไปดูได้ที่นี่http://www.microsoft.com/downloads/details.aspx?familyid=7554F536-8C28-4598-9B72-EF94E038C891&displaylang=en จากนั้นก็เวลาเรียกใช้ Openrowset แทนที่จะเรียกจาก Excel 8.0 ก็เรียกจาก Excel 12.0 แทนและ
โดยมีตัวอย่างการเรียกแบบนี้นะ Openrowset(‘Microsoft.ACE.OLEDB.12.0′,‘Excel 12.0;Database=c:\excel.xls;HDR=Yes’,‘SELECT * FROM [Sheet1$]‘นกไฮไลน์ตัวที่ต้องเปลี่ยนแล้วล่ะ แค่นี้ก็จะใช้งานได้แล้วนะ
 

How to import text or csv file ?


หลังจากเรารู้วิธี Import excel ด้วยวิธี Openrowset ไปแล้ว ที่นี้จะแนะนำวิธี Import Text and CSV file กันบ้าง
 
โดยการ Import Text or CSV เนี้ยะเหมือนกันเดี๊ยะเลยนะ
 
OPENROWSET(‘Microsoft.Jet.OLEDB.4.0′, ‘Text;Database=c:\;HDR=no;FMT=comma;’, ‘SELECT * FROMimport.txt’)
OR
OPENROWSET(‘Microsoft.Jet.OLEDB.4.0′, ‘Text;Database=c:\;HDR=no;FMT=comma;’, ‘SELECT * FROMimport.csv’)
สิ่งที่ต้องเปลี่ยนถ้าจะนำไปใช้ นกก็ไฮไลน์ไว้แล้วนะ คิดว่าเอาไปใช้กันได้ชัวร์
Thank you พี่ป๊อป พี่โจ้ 

Select table_name from all_tables


If exists (select * from sys.all_objects where type=‘u’ and name=@tblName)
Exec (‘Drop table’ + @tblName)
ใช้สำหรับ check ว่ามี Table นี้หรือยัง ถ้ามีนกก็จะได้ drop มันก่อนไง
Thanks : พี่ต้อง , พี่ป๊อป

Error : app = new excel.application


เรื่องของเรื่องมีอยู่ว่านกเขียนโปรแกรมเพื่อจะ Convert Excel File ทีนี้ก็ต้องมีการประกาศใช้ Excel Application ใช่ม่ะ แต่ทีนี้ดันมี Error
  
Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005.
 


ทีนี้เรามาดูวิธีแก้ไขกันดีกว่านะ ขอบอกว่าอันนี้แจ่มมาก ก็คลิกไปทีนี้เลยนะhttp://blog.crowe.co.nz/archive/2006/03/02/589.aspx
 
รับรองว่าแก้ไขปัญหา Error นี้ได้แน่นอน ไม่ต้อง Restart เครื่องด้วยนะจะบอกให้ อิอิ
 


ตอนนี้เขียน .net เพื่อให้ติดต่อกับ excel โดย excel ที่นกใช้เป็น 2007 ทีนี้ดันเกิดปัญหาไม่สามารถแก้ไขไฟล์ได้
 
Exception from HRESULT: 0x800A03EC
 
โอ้แม่เจ้า หากันนานเลยว่าจะแก้ยังไงสรุปคือเป็น bug ของโปรแกรมนะ ในเรื่องของภาษา เลยมีทางแก้ไขโดยดูได้จากเจ้าของผลิตภัณฑ์เลย
 
 
เวิร์คสุด แม้ว่าในตัวอย่างจะไม่ใช่ 2007 ก็เหอะนะ แต่ว่าทำตามแล้วได้ผล แต่ตอนนี้นกมี error อื่นเพิ่มมาอีกตัวล่ะ หะหะ เด๋วหาทางแก้ก่อนนะ
 
 
———————————–
เพิ่มเติมต่ออีกหน่อยนะ
 
Function SetCI() As Object
Dim oldCI As System.Globalization.CultureInfo = _
System.Threading.Thread.CurrentThread.CurrentCulture
System.Threading.Thread.CurrentThread.CurrentCulture = _
New System.Globalization.CultureInfo("en-US")
Return oldCI
End Function
แล้วเวลาเรียกใช้ก็แบบนี้เลย ส่วนใหญ่บรรทัด(ข้างล่าง) จะใช้ตอนหลังจากเรียก Excel ไปแล้ว
System.Threading.Thread.CurrentThread.CurrentCulture = SetCI()

Registry มีปัญหา


นกไม่แน่ใจว่าไปลงโปรแกรมยังไง ดันทำให้ EXCEL มีปัญหาดันเซฟไฟล์ไม่ได้ซะงั้น มี Error อย่างยาวเลยอ่ะ
 
Microsoft Office Excel cannot access the file ‘c:\A92B3000′. There are several possible reasons:
• The file name or path does not exist.
• The file is being used by another program.
• The workbook you are trying to save has the same name as a currently open workbook.
 
ทางแก้ก็คือต้องลง service pack แต่เครื่องนกมันไม่ใช่ 2003 หน่ะซิค่ะ เลยยังไม่มี Service Pack นี่กำลังลอง Add/Remove 2007 อยู่ล่ะ
ไม่รู้จะได้ผลยังไงกัน แต่ไอ้ที่งงๆ คือทำไมมันรันไม่ได้แล้วอ่ะ ก็ตอนนั้นเพิ่ง Format เครื่องมันยังรันได้อยู่นี่นา หรือ เป็นเพราะแผ่น 2007
เพราะลงครั้งที่ได้กะไม่ได้ลงคนละแผ่นกันอ่ะ เอ้า !!! เด๋วลองหาทางกันต่อไปนะจ๊ะ
 
ปล. อืม ลืมบอกไปคราวนี้ที่มันขึ้น ERR แบบนี้ก็ตอนสั่งให้เซฟไฟล์ Excel

Upload File ไม่ได้


คือเรื่องของเรื่องมีอยู่ว่า นกจะใช้ File Upload ในการอัพโหลดไฟล์ใช่ป่ะ แล้วที่นี้บางไฟล์ก็ได้ บางไฟล์ก็ไม่ได้ เราจะแก้ไขกับปัญหานี้อย่างไร
 
เราต้องทำการเพิ่ม Script ในส่วนของ Web Config เข้าไปนะ เพิ่มใน tag <system.web>
 
     executionTimeout="90"
   maxRequestLength="4096"
   useFullyQualifiedRedirectUrl="false"
   minFreeThreads="8"
   minLocalRequestFreeThreads="4"
   appRequestQueueLimit="100"
  />
แล้วทีนี้ปกติอ่ะจะอัพโหลดไฟล์ได้แค่ประมาณ 4 MB กว่าๆ นะ แต่ถ้าเราจะกำหนด Size ของไฟล์ก็ปรับแก้ได้ตรงที่นกไฮไลท์ไว้ได้เลยนะ
ขอบคุณสำหรับข้อมูลจากเวปนี้ด้วยนะค่ะhttp://www.codeguru.com/csharp/.net/net_asp/files/article.php/c5335/

เซฟไฟล์ใน Server


คือนกจะสั่งให้มันเซฟไฟล์ใน server ทีนี้เราจะหา Path ได้จาก
 
server.mappath()
 
ทีนี้เราก็สั่ง SaveAs ได้เลย
 
ขอบคุณเวปนี้ด้วยนะจ๊ะ http://www.narisa.com/forums/index.php?showtopic=17059&mode=threaded
 
ปล. นกนี่ไม่ค่อยจำคำสั่งเล้ย จะใช้ทีไรก็เพิ่ง Google ทุ๊กที อิอิ
 

คือนกจะเอาไฟล์ Excel เข้า SQL แล้วทีนี้ก็หามาหลายวิธีแล้ว ยากเหลือเกิน เลยเจอวิธีนี้ คือ สร้าง Stroe Procedure แล้วก็ส่ง Parameter ไป
แต่ปัญหาคือ Execute ไม่ผ่านเจ้าค่ะ ขึ้น Error มาตัวแดงแจ๋เลย
 
 
SQL Server blocked access to STATEMENT ‘OpenRowset/OpenDatasource’ of component ‘Ad Hoc Distributed Queries’ because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of ‘Ad Hoc Distributed Queries’ by using sp_configure. For more information about enabling ‘Ad Hoc Distributed Queries’, see "Surface Area Configuration" in SQL Server Books Online.
 
ทีนี้วิธีแก้ก็ตามนี้เลยนะค่ะ
ขั้นแรกเข้าไปที่ : Start > All Programs > Microsoft SQL Server 2005 > Confuguration Tool > SQL Server Serface Area Configuration
ขั้นที่สองก็ตามนี้ : Serface Area Configuration for the Feature
ขั้นที่สามก็แบบนี้ : คลิกเครื่องหมายถูกหน้า Enable Table RowSet
 
รับลองแก้ได้หายสนิทค่ะ ทีนี้ก็ลอง Execute กันอีกทีนึงนะค่ะ

Export Excel to SQL by Store Procedure


ALTER procedure [dbo].[SP_ImportExcelFile](
@Source varchar(1000)
, @SourceSheet varchar(100)
, @DestinationTable varchar(100))
as
declare @retval int
–check if file exists
EXEC master..xp_fileexist @Source, @retval output
if @retval = 0
begin
print ‘file does not exist.’
return
end
– check if worksheet exists and if not use Sheet1
if @SourceSheet is null or @SourceSheet = 
set @SourceSheet = ‘[Sheet1$]‘
else
set @SourceSheet = ‘[' + ltrim(rtrim(@SourceSheet)) + '$]‘
if @DestinationTable is null or @DestinationTable = 
set @DestinationTable = substring(@SourceSheet, 2, len(@SourceSheet)- 3) + convert(varchar, getdate(), 126)
exec(‘select * into [' + @DestinationTable + '] from openrowset(”Microsoft.Jet.OLEDB.4.0”, ”Excel 8.0;HDR=YES;Database=’+ @Source + ”’, ‘ + @SourceSheet + ‘)’)

ก๊อปโค้ดไปใช้กันได้เลยนะ แล้วเวลา Excecute ก็ Add Job แล้วเลือกแบบ T-SQL
แล้วก็ Excecute Store Procedure ที่เราเพิ่งสร้างไปได้เลยนะค่ะ โดยตัวอย่างก็ประมาณนี้หน่ะค่ะ
EXEC dbGF.dbo.SP_ImportExcelFile ‘C:\Documents and Settings\Administrator\Desktop\a.xls’,
     ’Sheet1′
     ,’a’
ทีนี้ก็เปลี่ยน Path Source File , Sheet , Table Name ได้ตามต้องการเลยนะค่ะ
แล้วที่สำคัญอย่าลืมเลือกที่ Database ที่เราต้องการด้วยนะค่ะ รวมถึงต้องมีตารางด้วยนะ