我正在尝试将 LogParser 用于 ETL。我正在尝试使用以下命令导入此文件:
"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 。-数据库 LogParserTest -createtable -cleartable
它像这样创建一个表:
CREATE TABLE [dbo].[ZipCodes](
[CountryCode] [varchar](255) NULL,
[Zip] [int] NULL
);
如果我将命令更改为
"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 -headerrow:OFF -o:SQL -server 。-数据库 LogParserTest -createtable -cleartable
它创建下表: CREATE TABLE [dbo].[ZipCodes]( [CountryCode] varchar NULL, [Zip] varchar NULL );
所以TO_STRING(Field2) AS Zip INTO ZipCodes
创造[Zip] [varchar](255) NULL
。
然而,我的目标是使结果表成为:
CREATE TABLE [dbo].[ZipCodes](
[CountryCode] [char](2) NOT NULL,
[Zip] [char](5) NOT NULL
);
两列都保持 VARCHAR(255) NULL,带有 SUBSTR,如下所示:
SUBSTR(Field1, 0, 2) 作为国家代码,SUBSTR(TO_STRING(Field2), 0, 5) 作为 Zip
如何让 LogParser 创建具有固定长度 NOT NULL char 列的表?
有可能有点接近这个。首先预建表
请注意,您必须使用比输入宽一个字符的 varchar 列。
现在运行此命令,注意缺少
-createtable
,但如果需要,您可以将其保留在那里。它不会重新创建现有表:如果将正确的长度列创建为 char 或 varchar,则每一行都会出现以下错误:
但是,请注意
SELECT MAX(LEN([CountryCode])), MAX(LEN(ZIP)) FROM [LogparserTest].[dbo].[ZipCodes];
返回 2 和 5。使用扩展事件跟踪批量插入显示事情正在按如下方式进行参数化,所以我不知道发生了什么:(@Param000004 char(2),@Param000005 char(5))INSERT [LogparserTest].[dbo].ZipCodes VALUES(@Param000004,@Param000005)
所以此时你仍然需要执行一个 ALTER TABLE ALTER COLUMN 命令来改变每一列,所以它实际上并没有给你带来太多好处。