在 logparser 創建的表中設置列的列寬
我正在嘗試將 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 命令來改變每一列,所以它實際上並沒有給你帶來太多好處。