Estou tentando usar o LogParser para ETL. Estou tentando importar este arquivo com o seguinte comando:
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "SELECT Field1 AS CountryCode, Field2 AS Zip INTO ZipCodes FROM 'c:\Users\jdearing\Downloads\us.txt'" -i:TSV - headerrow:OFF -o:SQL -server . -database LogParserTest -createtable -cleartable
Ele cria uma tabela assim:
CREATE TABLE [dbo].[ZipCodes](
[CountryCode] [varchar](255) NULL,
[Zip] [int] NULL
);
Se eu mudar o comando para
"c:\Program Files (x86)\Log Parser 2.2\LogParser.exe" "SELECT Field1 AS CountryCode, TO_STRING(Field2) AS Zip INTO ZipCodes FROM 'c:\Users\jdearing\Downloads\us.txt'" -i :TSV -cabeçalho:OFF -o:SQL -servidor . -database LogParserTest -createtable -cleartable
Ele cria a seguinte tabela: CREATE TABLE [dbo].[ZipCodes]( [CountryCode] varchar NULL, [Zip] varchar NULL );
Assim TO_STRING(Field2) AS Zip INTO ZipCodes
cria [Zip] [varchar](255) NULL
.
Meu objetivo, no entanto, é que a tabela resultante seja:
CREATE TABLE [dbo].[ZipCodes](
[CountryCode] [char](2) NOT NULL,
[Zip] [char](5) NOT NULL
);
Ambas as colunas permanecem VARCHAR(255) NULL com um SUBSTR da seguinte forma:
SUBSTR(Campo1, 0, 2) AS CountryCode, SUBSTR(TO_STRING(Campo2), 0, 5) AS Zip
Como obtenho o LogParser para criar a tabela com colunas de caracteres NOT NULL de comprimento fixo?
É possível chegar um pouco perto disso. Primeiro pré-crie a tabela
Observe que você deve usar colunas varchar com um caractere mais largo que sua entrada.
Agora execute este comando, observe a falta de
-createtable
, mas você pode mantê-lo lá, se desejar. Ele não recria uma tabela existente:Se você criar as colunas de comprimento corretas como char ou varchar, obterá o seguinte erro para cada linha:
No entanto, observe que
SELECT MAX(LEN([CountryCode])), MAX(LEN(ZIP)) FROM [LogparserTest].[dbo].[ZipCodes];
Returns 2 e 5. Traçar a inserção em massa com eventos estendidos mostra que as coisas estão sendo parametrizadas da seguinte maneira, então não sei o que está acontecendo:(@Param000004 char(2),@Param000005 char(5))INSERT [LogparserTest].[dbo].ZipCodes VALUES(@Param000004,@Param000005)
Portanto, neste ponto, você ainda precisa executar um comando ALTER TABLE ALTER COLUMN para alterar cada coluna, para que não compre muito.