2014-10-29 89 views
0

I'm第N场寻找任何方式在SQL中提取像下面的数据:提取从记录

"Develop_Server Linux15a1 /home 5152384 2136036 2754616  44" 
"Homolog_Server Linux37a9 /var 5152384 2136036 2754616  57" 
"Produc_Server Linux43a5 /usr 5152384 2136036 2754616  98" 
"Produc_Server Linux23a0 /sys 5152384 2136036 2754616  43" 

select first field as Server, second field as Server_name, third field as FS, 
fourth field as fs_width, fifth field as FS_Used, sisxth field as FS_available, 
seventh field as Perc_Usage 
(Each row is a record) 
Please help me. 
Thanks. 
+0

只需使用的列名。请编辑您的问题并发布表格布局。 – 2014-10-29 12:08:03

+0

你使用的是什么rdbms?您无法按顺序访问列(很容易)。你为什么不知道名字? – 2014-10-29 12:08:09

+0

我正在使用MS SQL – user1658549 2014-10-29 12:12:32

回答

0

它看起来像你的行长度是固定的。你可以这样做:

select substr(row, 1, 19) as Server, 
     substr(row, 20, 10) as Server_name, 
     . . . 

你需要弄清楚正确的长度和偏移量是多少。

大多数数据库支持substr()substring()

您可能也想清除空格。大多数数据库支持trim()rtrim()ltrim()

+0

我们有数百个文件系统,不幸的是它们不是固定的长度。 – user1658549 2014-10-29 12:17:17

0

首先,创建目标表:按行

CREATE TABLE FinalTable 
([Server] varchar(50), 
[Server_name] varchar(50), 
[FS] varchar(50), 
[fs_width] varchar(50), 
[FS_Used] varchar(50), 
[FS_available] varchar(50), 
[Perc_Usage] varchar(50)) 
; 

使用游标和动态SQL,排

declare @sql varchar(max) 
declare @onlyField varchar(max) 

DECLARE db_cursor CURSOR FOR 
SELECT onlyField from logTable 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @onlyField 

WHILE @@FETCH_STATUS = 0 
BEGIN 
     SET @sql = 'insert into FinalTable select '''+REPLACE(@onlyField,'|',''',''')+'''' 

     EXEC (@sql) 

     FETCH NEXT FROM db_cursor INTO @onlyField 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

假设你的表被称为'logTable'并且只有一个字段'onlyField'并且由一个管道分隔'|' – Horaciux 2014-10-29 15:02:43

+0

@ user1658549你试过这个答案吗?如果它适合你,你能正式接受吗? http://stackoverflow.com/tour – Horaciux 2014-11-08 16:42:12