2014-01-17 102 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