2013-04-23 158 views
1

SQL Server表,我需要找到一個方法來創建一個包含字段定義的文本文件表(大約100或更多)的我的表結構應該是什麼樣子。下面是大小和描述字段名的示例:創建一個從文本文件

 
da_ctat 1 progress status of a sample 
vc_acct 6 Assigned account 
qc_bact 6 billing account #1 
lc_bac2 6 billing account #2 for a split 
... 
... 
zc_bar 12 z code 
pc_wav 1 wai 
oc_p1  1 ftp1 
tc_df1 1 ftp2 
kc_qq  1 ztp 
mc_split 1 split billing 

這裏是上面的文字是指

 
column 1-8 character is the field name 
column 9 space 
column 10-11 is the size of field name 
column 12 space 
column 13 - 80 is field comment 

我需要創建一個存儲過程或發現,將創建一個表中的一些其他的方式與領域顯示在上面。例如, 字段名稱爲da_ctat,長度爲1個字符,並且描述了「樣本的進度狀態」。在表中的下一個字段名爲vc_acct,長度爲6個字符和「分配帳戶」的描述等... a

因爲我有超過一百個字段來創建,有沒有辦法編寫存儲過程來創建表結構沒有我需要手動創建表的字段?

感謝您的幫助社區 尼克

+0

你能夠使用SSIS嗎? – swasheck 2013-04-23 15:25:31

+0

如何知道表名,列數據類型,主鍵等? – 2013-04-23 15:26:02

+0

表名稱需要被稱爲結果。所有字段都是字符,da_ctat可以是唯一鍵。 – Nick 2013-04-23 15:48:14

回答

2

這是一個一次性的工作,或者一些需要自動化?

對於一次性的,我會用Excel和大量的級聯。 100行確實不太適合手形式。

重複,我想這個預處理文件中選擇的腳本語言把它變成一個標準的SQL腳本。我的選擇是powershell,因爲它非常容易與sql server集成。

定義文件似乎不完全,因爲沒有字段類型的指示。他們都是整數,浮點數,varchar嗎?

+0

但是我必須說,我希望這些字段名稱是製作好的樣本數據,否則命名方法很糟糕。您也可能希望查看標準化數據。 – marceljg 2013-04-23 15:43:05

+0

這是一次性的事情。字段類型都是字符。不幸的是,我們以這種方式命名他們的領域的數據。 – Nick 2013-04-23 15:49:39

3

可能是最直接的方式做這將是具有固定寬度的平面文件作爲數據源創建的SSIS包。我將你的目標設置爲與你的最終表格不同的東西(即使用「rawdata」模式或者甚至是一個名爲「rawdata」的獨立數據庫)。您可以使用此初始映射來創建包含建議數據類型的表格(但您確實需要確保知道您的數據)。

SSIS

一旦你做到了這一點,你可以創建在SSIS foreach循環容器,通過具有這些平面文件源和您的原始目的地的特定文件夾進行迭代。如果這是一個一次性的事情,你可以通過安裝SQL Server數據工具到當前的Visual Studio 2010中安裝這樣做(如果有的話),否則安裝程序將VS 2010殼牌內安裝SSDT,如果你沒有它。如果這不是一次性的,那麼您將需要考慮安裝SSIS的授權,以便將其作爲一個可以安排定期運行的軟件包進行部署。

做不到這一切,你可以通過打開SSMS生成表模式,右鍵單擊目標數據庫,點擊任務,數據導入,選擇平面文件源,固定寬度的目標,映射你的源(你要去通過創建這些列的痛苦,如果你真的有> 100),然後生成一個創建表腳本。

但是,如果你真的只有那三列......

CREATE TABLE schema rawdata AUTHORIZATION <pick an owner here>; 
CREATE TABLE rawdata.rawfields (
    fieldname varchar(8), -- i'm actually unclear here because 
          -- the next column's name/purpose is unclear 
    fieldsize int, -- or other numeric datatype 
    fieldcomment varchar(255) 
); 

然後,你可以編寫一個簡單的C#或PowerShell腳本來迭代目錄中的文件。這看起來是這樣的:

C#

string fieldname, fieldsize, fieldcomments;    
var files = System.IO.Directory.GetFiles("path", "*.ext"); 
foreach (var file in files) 
{ 
    var lines = System.IO.File.ReadAllLines(file); 
    foreach (var line in lines) 
    { 
     fieldname = line.Substring(0, 8); 
     fieldsize = line.Substring(9, 1); 
     fieldcomments = line.Substring(10, 73); 
    } 
} 

從這裏,我會成立到SQL Server實例的連接,創建一個參數插入命令,插入變量中的數據。

BULK INSERT

創建一個格式文件:

<?xml version="1.0"?> 
<BCPFORMAT 
     xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RECORD> 
    <FIELD ID="1" xsi:type="CharFixed" LENGTH="8"/> 
    <FIELD ID="2" xsi:type="CharFixed" LENGTH="2"/> 
    <FIELD ID="3" xsi:type="CharFixed" LENGTH="68"/> 
    <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\r\n" 
    </RECORD> 
    <ROW> 
    <COLUMN SOURCE="1" NAME="fieldname" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="2" NAME="fieldlength" xsi:type="SQLCHAR" /> 
    <COLUMN SOURCE="3" NAME="fieldcomments" xsi:type="SQLCHAR" /> 
    </ROW> 
</BCPFORMAT> 

那麼你可以寫一個PowerShell腳本或C#應用程序遍歷目錄中的文件(如上)和電話(假設你可以得到一個受信任的連接)

bcp <<yourdatabase>>.rawdata.rawfiles in \\path\to\data\file.ext 
     -f \\path\to\format\file.Xml -T 

否則

bcp <<yourdatabase>>.rawdata.rawfiles in \\path\to\data\file.ext 
     -f \\path\to\format\file.Xml -U username -P password 
相關問題