2016-06-17 2 views
0

90k + ID에 대한 데이터를 조회하는 쿼리가 있습니다. 나는 일반적으로 데이터를 조회하는 ID의 목록을 때, 나는 SQL리스트 구문을 사용합니다 : SQL의 .txt 파일에서 데이터 읽기

where id in (1,2,3...,n) 

그러나, 90K ID를 쿼리에서이 조금 압도하고있다. 그래서 텍스트 파일에서이 ID 목록을 읽고 임시 테이블에 ID를 대량 삽입하고 where 절에서 하위 선택을 수행하는 것이 조금 더 쉬울 수도 있다고 생각했습니다.

create table #temp1 

bulk insert #temp1 from 'C:\Users\BXS8145\Documents\Temp\file.txt' 

select * from mainTable where id in (select id from #temp1) 

일괄 삽입을 사용할 수있는 적절한 권한이 없으므로이를 수행 할 수 없습니다.

다른 대안이 있습니까?

+0

id는 어디에서 오는가? 다른 테이블, 쿼리, 서버? – Matt

+0

@Matt 그들은 Excel 파일에서 나에게 주어졌으며 대부분의 경우 이전 쿼리에서 생성되었습니다. 그러나이 원래 쿼리를 얻을 방법이 없다는 주장을 들어 봅시다. – BenWS

+0

'openrowset' 함수로 .txt 파일을 읽을 수 있습니다. https://msdn.microsoft.com/en-us/library/ms190312.aspx –

답변

1

삽입 문자열

create Table #Temp (id int) 
Insert into #Temp values 
(1), << this would be a formula to format the string 
(2), 
... 

에 대한 수식을 만들 수 있습니다.

SELECT * into temptable 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
       'Excel 8.0;Database=C:\Documents and Settings\....\example.xls;IMEX=1', 
       'SELECT * FROM [Sheet1$]') 

기타 옵션

SSIS package to import Excel file

또한 작업에가는 데이터베이스를 마우스 오른쪽 버튼으로 클릭하여 즉시 SSMS에서이 같은 패키지를 생성 할 수는 수입 날짜와 설치 소스 파일로 엑셀.

연결된 서버를 만들 수있는 권한이 있습니까?

Excel에 있거나 txt 파일이라도 있으면 연결된 서버를 만들 수도 있습니다. SSMS를 관리자 권한으로 열어야합니다! 또한이 파일은 자신과 sqlagnet을 모두 믿을 수있는 접근 가능한 경로 여야합니다. 예 : 로컬 경로 또는 파일 공유 SSMS를 열면 Excel 연결된 서버를 만든 다음 쿼리합니다.

는 여기에 내가 TEH 연결된 서버 문을 생성하고 추가하는 데 사용하는 하나의 도구입니다

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

    IN ORDER TO QUERY EXCEL YOU MUST RUN SSMS AS ADMINISTRATOR!!!!!!! 

    This doesn't seem to affect import jobs run under the SQL Agent, but the way SSMS handles 
    permissions to folders it is not prviledged when accessing the ACE 12.0 OLEDB provider. 
    I have tried all of the in-process and giving direct permissions, etc. and only running SSMS as 
    Administrator seems to work 
*/ 

    DECLARE @RC int 
    DECLARE @server nvarchar(128) 
    DECLARE @srvproduct nvarchar(128) 
    DECLARE @provider nvarchar(128) 
    DECLARE @datasrc nvarchar(4000) 
    DECLARE @location nvarchar(4000) 
    DECLARE @provstr nvarchar(4000) 
    DECLARE @catalog nvarchar(128) 
    -- Set parameter values 
    SET @server = N'XLSERVER' 
    SET @srvproduct = N'Excel' 
    SET @provider = N'Microsoft.ACE.OLEDB.12.0' 
    --SET @provider = N'Microsoft.ACE.OLEDB.15.0' 
    SET @datasrc = N'FULLFILEPATH' 
    --SET @provstr = N'Excel 12.0; HDR=Yes' ---wihtout imex 
    SET @provstr = N'Excel 12.0;IMEX=1;HDR=YES;' ----Office 2007+ 
    --SET @provstr = N'Excel 8.0;IMEX=1;HDR=YES;' ----Office 97-2003 Uses Jet 4.0 instead of ACE 12.0 

    IF EXISTS(SELECT * FROM sys.servers WHERE name = @server) 
    BEGIN 
     --Drop The Current Server 
     EXEC master.dbo.sp_dropserver @server, @droplogins='droplogins' 
    END 

    EXEC @RC = [master].[dbo].[sp_addlinkedserver] @server, @srvproduct, @provider, 
    @datasrc, @location, @provstr, @catalog 

그리고 여기에 연결된 서버를 만든 후에는 데이터에서 선택할 수있는 방법이다. 파일을 열 수 없습니다.

SELECT * 
FROM 
    XLSERVER...Sheet1$ 
0

못생긴 해결 방법은 Excel로 데이터 과거이고, 당신은 대신 bulkinsertOPENROWSET을 시도 할 수 다음

select A.* 
from mainTable A 
Join #temp1 B on A.ID=B.ID 
관련 문제