如何查询固定位置表

时间:2014-05-02 20:59:20

标签: sql sql-server

我在sql server中有一个固定的位置表。它是一个两列表。一个主键,在查询中不需要或有用,而在一列varchar(4000)中的其余50个字段中。我想在表中选择三个不同的数据字段,并创建一个临时表来进行更多查询。字段用空格填充,因此所有变量都在文件中的相同位置。不知道从哪里开始,在这个主题上找不到多少。

3 个答案:

答案 0 :(得分:1)

;WITH CTE AS (
    SELECT RowID
        , SUBSTRING(Bigfield, 4,6) field1 
        , SUBSTRING(Bigfield, 11,2) field2 
        , SUBSTRING(Bigfield, 15,2) field3
    FROM Table
)
SELECT C.* 
FROM TableC 
    JOIN CTE ON C.RowID= CTE.RowID
WHERE CTE.field3 like '%re%'

丑陋,我同意将其导出并导入到真实的"结构会更好但是如果你需要的话,这是一种方法。

答案 1 :(得分:0)

你处于一个不好的地方,但是这可能会让你走上正轨,将这些数据分解成你可以使用的东西,具体取决于你的分隔符格式。 split函数来自this article,旨在与单字符分隔符一起使用。由于您使用的是固定宽度字段,因此您可能需要修改该函数以使其执行您想要执行的操作(我将过滤掉您使用示例数据获得的大量空白行,因为这个)。

create table ##data (id int identity, data varchar(4000))

insert into ##data (data) values ('some_text2  12  21        44     xxx')
insert into ##data (data) values ('some_text   10  20        40     xyz')

select id, split.pn, split.s
FROM ##data dt
    CROSS APPLY dbo.Split(' ', dt.data) AS split
WHERE split.s != ''



CREATE FUNCTION dbo.Split(@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, stop) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
      WHERE stop > 0
    )
    SELECT pn,
      SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
    FROM Pieces
  )

答案 2 :(得分:0)

好。我发现这很好用,我不需要导出和重新导入。

选择
    SUBSTRING(rec,58,4)+' /' +

SUBSTRING(rec,62,2) + '/' +

SUBSTRING(rec,64,2) as dDate,

(SUBSTRING(rec,132,3)) as dCounty

来自tablename