我编写了一个查询来创建一个字符串并在值之间添加填充。然后将其导出为文本文件,以便加载到旧系统中。
我使用表变量从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 :(得分: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>