2016-09-02 2 views
0

파일 디렉토리에서 OpenRowSet (@Database)으로 구문 분석 할 동적 SQL을 사용하려고합니다. 지금 Excel 파일에 대한 하드 코딩 된 디렉터리가 있습니다. 최종 결과는 사용자의 파일을 가져 와서 SQL 테이블로 가져 오는 응용 프로그램을 만드는 것입니다. 거기에서 내가 합병하고 일치/일치하지 않음 (어떤 것이 제대로 작동하는지)입니다. 이것은 퍼즐의 마지막 부분입니다. 오류 메시지가 내 파일을 찾고있는 이유를 모르겠다 "C : \ WINDOWS를 \ system32를 \"OpenRowSet 내부의 동적 SQL이 Temp 테이블에 삽입되었습니다.

내 현재의 에러 메시지는 다음과 같습니다

OLE DB 공급자 "Microsoft.ACE.OLEDB. 12.0 "연결된 서버"(null) "returned message"Microsoft Access 데이터베이스 엔진이 'C : \ WINDOWS \ system32 \ C : \ Users \ GrimRieber \ Desktop \ isi test.xlsx'개체를 찾을 수 없습니다. 'C : \ WINDOWS \ system32 \ C : \ Users \ GrimRieber \ Desktop \ isi test.xlsx'가 로컬 개체가 아닌 경우 네트워크 연결을 확인하거나 서버에 연결하십시오 관리자.".

메시지 7303, 수준 16, 상태 1, 줄 1
OLE DB 공급자 연결된 서버 "Microsoft.ACE.OLEDB.12.0" "(널)"의 데이터 원본 개체를 초기화 할 수 없습니다.

코드 :

declare @Database varchar(max) 

select @Database = 'C:\Users\GrimRieber\Desktop\isi test.xlsx' 

declare @sql varchar(Max) 

select @sql = 'SELECT * FROM OPENROWSET(
''Microsoft.ACE.OLEDB.12.0'', 
''Excel 12.0; Database= ' + @Database + '; HDR=YES; IMEX=1'', 
''SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num],[01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[Year]FROM [Data$]'' 
)' 

IF OBJECT_ID('tempdb.dbo.#TempScorecardInventorySold', 'U') IS NOT NULL 
    DROP TABLE #TempScorecardInventorySold; 

CREATE TABLE #TempScorecardInventorySold 
(
    [Vendor] [varchar](50) NULL, 
    [VendorName] [varchar](50) NULL, 
    [Material] [varchar](50) NULL, 
    [MaterialName] [varchar](50) NULL, 
    [Supplier Stock Num] [varchar](50) NULL, 
    [01] [nVarchar](50) NULL, 
    [02] [nVarchar](50) NULL, 
    [03] [nVarchar](50) NULL, 
    [04] [nVarchar](50) NULL, 
    [05] [nVarchar](50) NULL, 
    [06] [nVarchar](50) NULL, 
    [07] [nVarchar](50) NULL, 
    [08] [nVarchar](50) NULL, 
    [09] [nVarchar](50) NULL, 
    [10] [nVarchar](50) NULL, 
    [11] [nVarchar](50) NULL, 
    [12] [nVarchar](50) NULL, 
    [Year] [Int] Null 
) ON [PRIMARY]; 

INSERT INTO [dbo].#TempScorecardInventorySold ([Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num],[01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[Year]) 
EXECUTE(@sql) 

답변

0

나는 필드를 정의해야합니다 파일 경로 문제 (파일의 경로와 파일 확장자에있는 경우주의 깊게 확인하시기 바랍니다), 그 설정에 OPENROWSET()을 다시 만들 수는 없지만 시작 부분에 SELECT 절. 마지막 인수가 범위를 워크 시트를 가리키는, 인용 부호가 있어야한다 : 또는

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'', 
       ''Excel 12.0; Database= ' + @Database + '; HDR=YES; IMEX=1'', [Data$])'; 

OPENDATASOURCE을 고려

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENDATASOURCE(''Microsoft.ACE.OLEDB.12.0'', 
       ''Data Source=' + @Database + ';Extended Properties=Excel 12.0'')...Data$' 

심지어 드라이버 버전 (필드는 두 SELECT 조항 중 하나에있을 수 있습니다)

select @sql = 'SELECT [Vendor],[VendorName],[Material],[MaterialName],[Supplier Stock Num], 
         [01],[02],[03],[04],[05],[06], 
         [07],[08],[09],[10],[11],[12],[Year] 
       FROM OPENROWSET(''MSDASQL'', 
       ''Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}; 
       DBQ=' + @Database + ''', ''SELECT * FROM [DATA$]''); 
+0

빠른 응답 감사합니다. OPENDATASOURCE는 내가 가진 문제를 해결했습니다. Data $ 끝 부분에 진드기를 추가하면 모든 작업이 완료되었습니다. –

+0

좋아요! 다행히 도울 수있어. 그러나 재미있는 것은 처음에는 효과가 없습니다. 설정/버전 항목 일 수 있습니다. – Parfait

관련 문제