SSMS에서 탭으로 구분 된 파일을 쿼리 할 수 ​​있습니까?


14

Sql Server Management Studio에서 탭으로 구분 된 파일을 쿼리하여 데이터를 저장하지 않고 데이터를 볼 수 있습니까?

나는 당신이 BULK INSERT다음과 같은 것을 사용하여 탭으로 구분 된 파일에서 할 수 있다는 것을 알고 있습니다 :

BULK INSERT SomeTable
FROM 'MyFile.txt'
WITH (
FIELDTERMINATOR = '\t',
ROWTERMINATOR = '\n');

그러나이를 위해서는 사전에 열을 알고 데이터를 보유 할 테이블을 작성해야합니다.

또한 열을 사용하여 사전에 정의하지 않고 CSV 또는 Excel과 같은 다른 파일 형식과 OPENROWSETExcel 드라이버를 쿼리 할 수 ​​있다는 것을 알고 있습니다 .

-- Query CSV
SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;', 
    'SELECT * FROM MyFile.csv')

-- Query Excel
SELECT *
FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 
    'Excel 8.0;Database=MyFile.xls', 
    'SELECT * FROM [Sheet1$]')

나는 레지스트리 키를 변경하는 경우 또한, Format아래 HKLM\Software\Microsoft\Office\12.0\Access Connectivity Engine\Engines\Text에서 CSVDelimitedTabDelimited는 SQL Server에서 위의 CSV 쿼리가 제대로 내가 원하는 생각하지 않도록 그러나 더 이상 쉼표로 구분 된 텍스트 파일을 읽을 수, 탭으로 구분 된 텍스트 파일을 읽을 수 없습니다 그런 식으로 남겨 두십시오.

사용하려고 Format=TabDelimited에서 것은 OPENROWSET중 하나가 작동하지 않습니다

SELECT * 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Text;Database=\\Server\Folder\;HDR=Yes;Format=TabDelimited', 
    'SELECT * FROM MyFile.txt')

Text레지스트리 키를 EnginesISAM Formats키에서 기본값 인 사용자 지정 으로 복사하려고 시도 TabDelimited했지만 형식 CSVFormat대신 파일을 여전히 읽고 TabDelimited있으므로 여기에 뭔가 빠져 있어야합니다.

테이블과 테이블을 만들지 않고도 탭으로 구분 된 파일을 쿼리하여 내용을 볼 수있는 방법 BULK INSERT이 있습니까?

SQL Server 2005를 사용하고 있습니다


사용 후 플러시되는 동적으로 작성된 임시 테이블을 사용할 수 있습니까?
jcolebrand

두 번째 질문 : Excel 드라이버를 사용하여 TDF를 열어 보셨습니까? 때때로 Excel은 마법입니다.
jcolebrand

@jcolebrand 예 임시 테이블을 사용할 수는 있지만 열 목록이 길고 변경 될 수 있으므로 모든 열에 대한 정의를 작성하는 대신 관심있는 열만 지정할 수 있습니다. 불필요한 열이 변경 될 때마다 업데이트해야합니다.
Rachel

@jcolebrand 나는 지금 유망한 것으로 보이지는 않지만 엑셀 드라이버를 시도하지 않았다. 파일 확장자는 실제로 .bak정상적인 구분 파일 확장자가 아니며, 첫 번째 시도에서 나에게 준 오류는입니다 Could not find installable ISAM. 그래서 이것이 효과가 있다고 생각하지 않습니다.
Rachel

2
가져 오기에 필요한 열 수를 유지하는 대신 동적으로 생성 된 임시 테이블을 유지하려고하는 대신 매번 파일에서 열 목록을 직접 파싱합니다 (파일의 첫 번째 줄에서 탭 수를 수행하십시오). . 내 의견으로는 데이터에서 리버스 엔지니어링 할 수있는 것을 하드 코딩하지 마십시오.
jcolebrand

답변:


13

여는 텍스트 파일과 동일한 디렉토리에 구분 기호가 포함 된 schema.ini 파일을 작성해야합니다. 파일 단위로 레지스트리 값을 재정의하는 유일한 방법입니다. MSDN 의 파일 형식 설명서를 참조하십시오 . 예:

SELECT * 
FROM OPENROWSET(
    'Microsoft.ACE.OLEDB.12.0', 
    'Text; HDR=YES; Database=C:\Text', 
    'SELECT * FROM testupload2.txt')

C : \ Text \ schema.ini에서 :

[testupload2.txt]
ColNameHeader=True
Format=TabDelimited
MaxScanRows=0

이 활동을 자주 반복해야하는 경우 schema.ini를 작성하는 스크립트를 제안합니다. 동일한 schema.ini에서 여러 파일을 참조하거나 별도의 schema.ini를 각 텍스트 파일에 자체 디렉토리에 포함시킬 수 있습니다.


대단히 감사합니다! schema.ini 파일 사용에 대한 힌트를 보았지만 직접 구현하는 방법을 알아내는 데 어려움을 겪고있었습니다
Rachel

나는 이것이 오래된 게시물이라는 것을 알고 있지만 단지 "Nice Job"@dartonw라고 말해야했습니다.
Jeff Moden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.