SQL Server将填充添加到字符串

时间:2014-01-17 10:19:22

标签: sql sql-server sql-server-2005

我编写了一个查询来创建一个字符串并在值之间添加填充。然后将其导出为文本文件,以便加载到旧系统中。

我使用表变量从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   

谢谢。

3 个答案:

答案 0 :(得分: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';

无法测试,但应该是你需要...

答案 1 :(得分: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

略微编辑帖子以克服&#39;&#39;&#39;&#39;不能作为十进制CAST。

答案 2 :(得分: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>