2014-01-17 130 views
1

我寫了一個查詢來創建一個字符串並在值之間添加填充。然後將其作爲文本文件導出,以便加載到遺留系統中。SQL Server添加填充到字符串

我已經使用表變量從table1中提取所有源數據,然後使用CAST運行查詢以使用填充創建所需的字符串。

我的問題是;如果不使用表變量(或臨時表),可以使用更少的步驟來實現這一點,而CAST是最好的方法嗎?

不幸的是,使用填充字符串是創建合適的上傳文件的唯一方法。

樣本數據和查詢:

CREATE TABLE dbo.table1(
    [source1] [varchar](6), 
    [source2] [varchar](8), 
    [source3] [varchar](6), 
    [source4] [varchar](3), 
    [source5] [varchar](10), 
    [source6] [varchar](5), 
    [source7] [decimal](17, 2) 
    ); 


INSERT INTO dbo.table1 VALUES (999999,55566889,8964,'OPL',25648,'CR',12.35); 
INSERT INTO dbo.table1 VALUES (222222,44422258,2548,'EWP',25698,'CR',10248.25); 
INSERT INTO dbo.table1 VALUES (999999,33355589,3655,'SDO',75869,'DR',-897623.25); 
INSERT INTO dbo.table1 VALUES (444444,11155987,5742,'SVI',25698,'CR',100023.36); 
INSERT INTO dbo.table1 VALUES (555555,41555585,2586,'PLW',65879,'DR',-45.69); 

Declare @TempTableVariable Table(
    column1 nchar(15), 
    column2 nchar(6), 
    column3 nchar(3), 
    column4 nchar(10), 
    column5 nchar(6), 
    column6 nchar(25), 
    column7 nchar(17), 
    column8 nchar(17) 
    ); 

INSERT INTO @TempTableVariable 
SELECT 
    source1 + source2 AS column1, 
    source3 AS column2, 
    source4 AS column3, 
    source5 AS column4, 
    source1 AS column5, 
    source6 AS column6, 
    CASE WHEN source7 > 0 THEN ABS(source7) ELSE NULL END AS column7, 
    CASE WHEN source7 < 0 THEN ABS(source7) ELSE NULL END AS column8 
FROM dbo.table1 
WHERE source1 = '999999'; 

SELECT 
    column1 AS SetID, 
    CAST(ISNULL(column2,'') AS nchar(4)) + 
    CAST(ISNULL(column3,'') AS nchar(6)) + 
    CAST(ISNULL(column4,'') AS nchar(14)) + 
    CAST(column5 AS nchar(7)) + 
    CAST(column1 AS nchar(15)) + 
    CAST(ISNULL(column7,'') AS nchar(17)) + 
    CAST(ISNULL(column8,'') AS nchar(17)) AS Input 
FROM @TempTableVariable; 

結果:

SETID|INPUT 
99999955566889|8964OPL 25648   999999 99999955566889 12.35    
99999933355589|3655SDO 75869   999999 99999933355589     897623.25 

謝謝。

+0

您可以將INSERT語句封裝在CTE中,然後擺脫@TempTableVariable,請參閱下面的答案。 – NickyvV

回答

0

的CTE溶液將以下內容:

;WITH cte AS 
(
    SELECT 
    source1 + source2 AS column1, 
    source3 AS column2, 
    source4 AS column3, 
    source5 AS column4, 
    source1 AS column5, 
    source6 AS column6, 
    CASE WHEN source7 > 0 THEN ABS(source7) ELSE NULL END AS column7, 
    CASE WHEN source7 < 0 THEN ABS(source7) ELSE NULL END AS column8 
    FROM dbo.table1 
    WHERE source1 = '999999' 
) 
SELECT 
    column1 AS SetID, 
    CAST(ISNULL(column2,'') AS nchar(4)) + 
    CAST(ISNULL(column3,'') AS nchar(6)) + 
    CAST(ISNULL(column4,'') AS nchar(14)) + 
    CAST(column5 AS nchar(7)) + 
    CAST(column1 AS nchar(15)) + 
    CAST(ISNULL(CAST(column7 AS nchar(17)),'') AS nchar(17)) + 
    CAST(ISNULL(CAST(column8 AS nchar(17)),'') AS nchar(17)) AS Input 
FROM cte 

略加編輯後,以克服的事實,「」不能被強制轉換爲十進制。

+0

我以前從未使用過CTE。很高興知道。這與一個大型錄音機的工作能力有多相似......大約500K左右? – sticks

0

不知道爲什麼你使用的是@temp表,但試試這個:

SELECT 
     CAST(source1 + source2 AS nchar(15)) as column1, 
     CAST(ISNULL(source2,'') AS nchar(4))+ 
     CAST(ISNULL(column4,'') AS nchar(6))+ 
     CAST(ISNULL(column5,'') AS nchar(14))+ 
     CAST(column1 AS nchar(7)) + 
     CAST(column6 AS nchar(15)) + 
     CASE WHEN source7 > 0 THEN CAST(ISNULL(abs(source7),'') AS nchar(17)) 
      ELSE NULL END + 
     CASE WHEN source7 < 0 THEN CAST(ISNULL(abs(source7),'') AS nchar(17)) 
      ELSE NULL END AS column2 

    FROM dbo.table1 
    WHERE source1 = '999999'; 

不能測試,但應該會需要...

+0

嗨,感謝您的輸入,但這不會達到所需的結果。你的查詢會給8個結果列,當它需要只有2個時,需要填充。我使用了一個臨時表來允許我成功地處理NULL,因爲任何NULL都會在我的Input列上導致NULL。 – sticks

+0

我的歉意,它不是100%清楚你的文章。您可以連接列(在上面的示例中將逗號替換爲+要組合的列)我修改了查詢以將結果連接成兩列。 – Sparky

0

使用帶有格式文件的BCP實用程序。您不必手工輸出輸出,而是告訴SQL Server文本文件的佈局,然後讓它完成所有工作。它也非常快。

<?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="CharTerm" TERMINATOR="|"/> 
    <FIELD ID="2" xsi:type="CharFixed" LENGTH="4"/> 
    <FIELD ID="3" xsi:type="CharFixed" LENGTH="6"/> 
    <FIELD ID="4" xsi:type="CharFixed" LENGTH="14"/> 
    <FIELD ID="5" xsi:type="CharFixed" LENGTH="7"/> 
    <FIELD ID="6" xsi:type="CharFixed" LENGTH="15"/> 
    <FIELD ID="7" xsi:type="CharFixed" LENGTH="17"/> 
    <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="\n"/> 
</RECORD> 
<ROW> 
    <COLUMN SOURCE="1" NAME="c1" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="2" NAME="c2" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="3" NAME="c3" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="4" NAME="c4" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="5" NAME="c5" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="6" NAME="c6" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="7" NAME="c7" xsi:type="SQLCHAR"/> 
    <COLUMN SOURCE="8" NAME="c8" xsi:type="SQLCHAR"/> 
</ROW> 
</BCPFORMAT> 
+0

謝謝。這對我來說完全陌生,但我很感興趣。我會再看看這個。 – sticks