Etl

在 logparser 創建的表中設置列的列寬

  • July 2, 2015

我正在嘗試將 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 -標題行:關閉 -o:SQL 伺服器。-database 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 。-database 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) AS CountryCode, SUBSTR(TO_STRING(Field2), 0, 5) AS 郵編

如何讓 LogParser 創建具有固定長度 NOT NULL 字元列的表?

它可能有點接近這一點。首先預創建表

IF object_id('[LogparserTest].[dbo].[ZipCodes]') IS NOT NULL
BEGIN 
   DROP TABLE [dbo].[ZipCodes]
END

CREATE TABLE [dbo].[ZipCodes](
   [CountryCode] [varchar](3) NOT NULL,
   [Zip] [varchar](6) NOT NULL
);

請注意,您必須使用比輸入寬一個字元的 varchar 列。

現在執行此命令,注意缺少-createtable,但如果您願意,可以將其保留在那裡。它不會重新創建現有表:

“c:\Program Files (x86)\Log Parser 2.2\LogParser.exe” “SELECT SUBSTR(Field1, 0, 1) AS CountryCode, SUBSTR(TO_STRING(Field2), 0, 5) AS Zip INTO ZipCodes FROM ‘c: \Users\jdearing\Downloads\us.txt’” -i:TSV -headerrow:OFF -o:SQL -server 。-database LogParserTest -cleartable -transactionRowCount:0 -ignoreMinWarns:OFF

如果您將正確的長度列創建為 char 或 varchar,則每行都會出現以下錯誤:

An error occurred while uploading data to SQL table
 SQL State:     22001
 Native Error:  0
 Error Message: [Microsoft][ODBC SQL Server Driver]String data, right
 truncation

但是,請注意SELECT MAX(LEN([CountryCode])), MAX(LEN(ZIP)) FROM [LogparserTest].[dbo].[ZipCodes];返回 2 和 5。使用擴展事件跟踪批量插入表明事情正在參數化如下,所以我不知道發生了什麼:

(@Param000004 字元(2),@Param000005 字元(5))插入

$$ LogparserTest $$.$$ dbo $$.ZipCodes VALUES(@Param000004,@Param000005) 所以此時你仍然需要執行一個 ALTER TABLE ALTER COLUMN 命令來改變每一列,所以它實際上並沒有給你帶來太多好處。

引用自:https://dba.stackexchange.com/questions/105731