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