簡體   English   中英

SQL Server將填充添加到字符串

[英]SQL Server add padding to a string

我寫了一個查詢來創建一個字符串並在值之間添加填充。 然后將其導出為文本文件,以便加載到舊版系統中。

我使用了一個表變量從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   

謝謝。

不知道為什么要使用@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';

無法測試,但您需要嗎?

具有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

略微修改了帖子以克服''不能將CAST轉換為十進制的事實。

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM