2013-03-02 2 views
3

데이터를 가져 오려면 다른 폴더에 Excel 템플릿을 복사해야합니다.SQL Server 2008 R2에서 OPENROWSET을 사용하여 Excel로 가져올 수 없습니다.

문 1 :

exec xp_cmdshell 'copy C:\inetpub\wwwroot\app_data\export_templates\myExport.xlsx C:\inetpub\wwwroot\app_data\tmp\myExport130301172218.xls' 

문장 2 : I 별도로 위의 SQL 문을 실행하면, 그들은 잘 작동

insert into 
OPENROWSET('Microsoft.ACE.OLEDB.12.0' 
    , 'Excel 12.0;Database=C:\inetpub\wwwroot\app_data\tmp\myExport130301172218.xls;' 
    , 'SELECT * FROM [Sheet1$]') 
SELECT * FROM vw_shrub 

다음은 내가 사용이 SQL 문이다. 그러나 함께 실행하면 다음과 같은 오류가 발생합니다.

OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)" returned message "The Microsoft Access database engine could not find the object 'Sheet1$'. Make sure the object exists and that you spell its name and the path name correctly. If 'Sheet1$' is not a local object, check your network connection or contact the server administrator.".

Msg 7350, Level 16, State 2, Line 2
Cannot get the column information from OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "(null)".

문제는 단일 응용 프로그램에서 모두 응용 프로그램에서 전달하려는 것입니다. 그러므로 나는 그들을 함께 실행해야한다. 나는 그들 사이에 GO를 추가하면 Management Studio에서 함께 실행할 수있는 것으로 나타났습니다. 하지만 응용 프로그램에서 요청을 전달하면 GO를 사용할 수 없습니다.

+0

복사의 경로가 OPENROWSET의 경로와 다른 이유 –

+0

Speot 죄송합니다. 그것은 내 질문에 표본을 쓸 때 실수였다. 그러나 문제는 여전히 서있다. 나는 그 질문을 갱신했다. 고맙습니다. – Fred

+0

저장 프로 시저를 만들고 대신 응용 프로그램에서 프로 시저를 호출하지 않는 이유 – Raymund

답변

0

EXEC 명령문 뒤에 GO를 추가하려고 시도 했습니까?

SQL Server에 연결된 계정에 SQL Temp 디렉터리에 대한 읽기/쓰기 권한이 있습니까? 내 이해는 SQL 임시 디렉터리에 xls 파일을 복사합니다 및 사용자가 관리자 권한 또는 임시 디렉터리에 Windows 읽기/쓰기 권한이없는 경우 연결이 실패합니다.

+0

그것은 SQL 서버에 연결되어 있습니다. 앞서 언급 한 것처럼 Mng Studio에서 Go를 사용하면 작동합니다. 하지만 내 코드에서 t-sql에서 사용할 수 없습니다. – Fred

+0

오해의 소지가 있습니다. 사용자 계정 BlahBlah를 사용하여 SQL Server에 연결하는 경우 BlahBlah는 SQL Server 임시 디렉터리 (C ​​: \ Program Files \ Microsoft \ SQL Server \ 10.0 \ temp와 같은 경로가 무엇인지 확실하지 않음)에 대한 읽기/쓰기 액세스 권한을 갖고 있습니까? – user1238918

+0

사용자 계정에 읽기/쓰기 권한이 있습니다. 위의 설명에서 볼 수 있듯이, while 문을 사용하여 statement1과 statement2를 실행하면 완벽하게 실행됩니다. 그러나 내가 GO 라인을 제거하면 작동하지 않습니다. 두 시나리오가 동일한 사용자 이름을 사용하고 있으므로 사용 권한 문제가 없음을 의미합니다. – Fred

1

대안 SQL Server 에이전트 작업에서 두 ​​개의 서로 다른 단계로이 두 줄을 단일 명령으로 실행할 수 :

sp_start_job nameOfYourJob 

에서 GO이처럼 작업 행위의 두 단계 중에서.

+0

좋은 지적 Zelloss. 하지만 내 질문은 SQL Server가 두 문을 함께 실행할 때 다르게 작동하는 이유입니다. 그 행동에 대한 논리적 인 설명이 있습니까? GO 문과 함께 작동하면 모든 것이 옳고 권한 문제가없고 구문도 정확하다는 것을 의미합니다. 그러나 왜 두 가지 다른 문장으로 실행되어야합니까? – Fred

+1

내 생각 엔 비동기식 명령어와 삽입물이 엑셀을 삽입하려고 시도 할 때와 같이 사본을 종료 할 시간이 없다는 것입니다. 아마도 이것은 복사와 삽입 사이의 같은 디렉토리에'exec xp_cmdshell 'dir을''test'할 수 있습니다. – Zelloss

+0

그게 옳은 대답 일 겁니다. 그러나 이것이 사실인지 궁금 해서요. 적어도 빈 파일은 끝에 복사해야합니다. 생각하지 않니? – Fred

관련 문제