2017-03-09 1 views
4

임 지금까지 내가이 있고, SQL 서버로 CSV 파일을 가져 오는 대량의 프로세스를 자동화하려고 :TSQL - 컬럼의 레코드를 기반으로 테이블 컬럼을 작성

----Allow for SQL to use cmd shell 
--EXEC sp_configure 'show advanced options', 1 -- To allow advanced options to be changed. 
--RECONFIGURE -- To update the currently configured value for advanced options. 
--EXEC sp_configure 'xp_cmdshell', 1 -- To enable the feature. 
--RECONFIGURE -- To update the currently configured value for this feature. 

SET NOCOUNT ON 
--Loop through all of the files 
CREATE TABLE #tmp(excelFileName VARCHAR(100)); 
CREATE TABLE #tmpCol(col NVARCHAR(MAX)); 
INSERT INTO #tmp 
EXEC xp_cmdshell 'dir /B "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\"'; 

DECLARE @fileName varchar(100) 
DECLARE @tableName varchar(MAX) 
DECLARE @sql  varchar(MAX) 

While (Select Count(*) From #tmp where excelFileName is not null) > 0 
Begin 

    Select Top 1 @fileName = excelFileName From #tmp 

    SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSide\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)' 
    EXEC (@sql) 

    UPDATE #tmpCol SET col = REPLACE(col, '"', '') 
    UPDATE #tmpCol SET col = REPLACE(col, ' ', '') 

    SET @tableName = LEFT(@filename, LEN(@filename) -4) 
    CREATE TABLE @tableNAme () 


    Delete from #tmp Where excelFileName = @FileName 

End 
DROP TABLE #tmp 
DROP TABLE #tmpCol 

@sql 대량 삽입은 열을 가져옵니다을 헤더를 필요로하지만, 실제로 이것을 CREATE TABLE 문에 전달하는 방법을 파악할 수 없습니다.

도움이 될 것입니다.

----- 편집 ---------------------------------------- -----------

제가 결국 다음 (I는 루프에 넣어)을 동적 SQL을 사용 CREATE TABLE을 변경 한 후 :

----Allow for SQL to use cmd shell 
--EXEC sp_configure 'show advanced options', 1 -- To allow advanced options to be changed. 
--RECONFIGURE -- To update the currently configured value for advanced options. 
--EXEC sp_configure 'xp_cmdshell', 1 -- To enable the feature. 
--RECONFIGURE -- To update the currently configured value for this feature. 

SET NOCOUNT ON 
--Loop through all of the files 
CREATE TABLE #tmp(excelFileName VARCHAR(100)); 
CREATE TABLE #tmpCol(col NVARCHAR(MAX)); 
INSERT INTO #tmp 
EXEC xp_cmdshell 'dir /B "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\"'; 

DECLARE @fileName varchar(100) 
DECLARE @tableName varchar(MAX) 
DECLARE @colName varchar(MAX) 
DECLARE @sql  varchar(MAX) 
DECLARE @sql2  varchar(max) 

While (Select Count(*) From #tmp where excelFileName is not null) > 0 
Begin 

    Select Top 1 @fileName = excelFileName From #tmp 

    SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)' 
    EXEC (@sql) 

    UPDATE #tmpCol SET col = REPLACE(col, '"', '') 
    UPDATE #tmpCol SET col = REPLACE(col, ' ', '') 

    WHILE (SELECT COUNT(*) FROM #tmpCol WHERE col IS NOT NULL) > 0 
    BEGIN 

     Select Top 1 @colName = col From #tmpCol 

     SET @tableName = LEFT(@filename, LEN(@filename) - 5) 


     SET @sql2 = 'CREATE TABLE [' + @tableName + '](' 
     SELECT @sql2 = @sql2 + '[' + col + '],' FROM #tmpCol 
     SET @sql2 = SUBSTRING(@sql2,1,LEN(@sql2) -1) + 'NVARCHAR(MAX)) ' 

     EXEC(@sql2) 

     DELETE FROM #tmpCol WHERE col = @colName 

    END 

    Delete from #tmp Where excelFileName = @FileName 

End 

DROP TABLE #tmp 
DROP TABLE #tmpCol 

문제는, 제 동적 SQL 쿼리이다

SET @sql = 'BULK INSERT #tmpCol FROM "C:\Users\owain.esau\OneDrive\Work\Companies\IronSude\backupFiles\' + @filename + '" WITH (ROWTERMINATOR = '','', LASTROW = 1)' 

마지막 행이 1로 설정되어 있기 때문에은 및 rowterminator 그것은 단 하나 개의 컬럼을 집어 ''이다. =

"Attachment Id","Attachment Owner Id","Modified By","Created By","Created Time","Modified Time","File Name",Size,"Parent Id","Attachment Type",Documents 

내가 LASTROW을 설정할 수 있습니다 어쨌든 거기에 '\ n을'의 첫 번째 인스턴스를 : 나는 '\ n을'에 RowTerminator을 변경하면이 같은 한 줄에 모두 넣는다?

+0

안녕하세요, @OwainEsau 귀하의 질문에 올바르게 답변을 – Pream

답변

2

당신이 달성하기 위해 동적 SQL를 사용할 수 있습니다

SET @tableName = LEFT(@filename, LEN(@filename) -4) 

DECLARE @strQuery VARCHAR(MAX) 
SET @strQuery = 'CREATE TABLE [' + @tableName + '](' 

SELECT @strQuery = @strQuery + '[' + col + '],' FROM #tmpCol 

SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) -1) + ') ' 

--If you want to execute the create table query 
EXEC(@strQuery) 

Delete from #tmp Where excelFileName = @FileName 

문자열 분할 기능

CREATE FUNCTION [dbo].[Split] 
(
    @String NVARCHAR(4000), 
    @Delimiter NCHAR(1) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH Split(stpos,endpos) 
    AS(
     SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos 
     UNION ALL 
     SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1) 
      FROM Split 
      WHERE endpos > 0 
    ) 
    SELECT 
     'Col' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos) 
    FROM Split 
) 
GO 

대신 rowterminator = ','를 사용하는 분할 기능을 사용하여 열 행을 분할 시도 할 수에게, 한 단계 더 추가해야합니다. 쉼표로 구분 된 문자열을 전달하는 것입니다 (먼저 변수에 할당하십시오). 위 함수에 질문을 제공했습니다.

첫째는 열 문자열 및 데이터 유형을 구성하고 LEFT와 LEN을 사용하여 ","마지막 제거

+0

고마워, 아주 도움이되었고 약간의 변경 (데이터 형식을 추가했다),하지만 지금은 새로운 문제 (위의 편집을 참조하십시오)와 함께왔다 –

+0

@ OwainEsau 내가 업데이 트되었습니다 내 대답 – Hadi

1

기능 참조 동적 내부 문자열을 사용 쿼리 문자열을 사용하여 원하는 동적 테이블을 만들 수 있습니다.

Declare @Columnslist varchar(max) 

SELECT @Columnslist = select COLUMN_NAME+' NVARCHAR(MAX),' from TABLE_NAME for xml path('') 

SELECT @Columnslist = LEFT(@Columnslist, LEN(@Columnslist) - 1) 

Declare @create_cmd varchar(max) 
set @create_cmd= 
'If Object_id('+char(39)[email protected]+char(39)+') is Not NULL 
Drop Table '[email protected]+' Create table '[email protected]+'('[email protected]+')' 

EXEC(@create_cmd); 
관련 문제