Is it possible to select column data using the ordinal_position for a table column? I know using ordinal positions is a bad practice but for a one-off data import process I need to be able to use the ordinal position to get the column data.
So for example
create table Test(
Col1 int,
Col2 nvarchar(10)
)
instead of using
select Col2 from Test
can I write
select "2" from Test -- for illustration purposes only
-
Yes, you could do this with some really ugly hits into the system tables. You'd probably need to fall into the world of dynamic sql.
I really, really do not recommend this approach.
If that didn't deter you, then this might get you started (ref):
select table_name, column_name, ordinal_position, data_type from information_schema.columns order by 1,3
-
No, you can't select columns based on their ordinal position, as far as I know.
When looking at the transact SQL reference, there is nothing to suggest you can (http://msdn.microsoft.com/en-us/library/ms176104(SQL.90).aspx).
-
You can use this query
select * from information_schema.columns
to get the ordinal positions of the columns. Like Michael Haren wrote, you'll have to build a dynamic query using this, either in code or in a sproc that you pass the column positions to.
FWIW, this is pure evil.
Also, deathofrats is right, you can't really do this, since you'll be building a regular query w/ column names based on position.
Andy Webb : Loved the "pure evil" remark :) -
I don't think you can. As @Michael Haren showed, you can use ordinal positions in ORDER BY clauses but I've never seen them used elsewhere in SQL Server.
I'm not sure what problem you are havng with your one-off data import that this would help with - presumably some unfortunate column name? Can you explain a little more?
rams : @robsoft - I am working with a DB that uses mapping info. Col names are stored in a mapping table. A proc with a HUGE case statement runs import and I am trying to improve it. Using dynamic SQL did not speed up the process.robsoft : ah, I see. That's quite an interesting problem! I wonder if it could be done by creating views dynamically? Wish i had something to hand right now to play with! :-) -
@Michael - After getting the ordinal position how would I use that information to get data out of column #3 (say)
@deathofrats - That's what it looks like. All the documentation I read before posting the question suggested that it is not possible.
-
You'd have to do sosmething like
declare @col1 as varchar(128) declare @col2 as varchar(128) declare @sq1 as varchar(8000) select @col1 = column_name from information_schema.columns where table_name = 'tablename' and ordinal_position = @position select @col2 = column_name from information_schema.columns where table_name = 'tablename' and ordinal_position = @position set @sql = 'select ' + col1 ',' + col2 'from tablename' exec(@sql)
rams : Thanks. My first attempt was using dynamic SQL which actually slowed my proc contrary to what I expected which led me to wonder if I could use the column ordinal position info any which way.Booji Boy : ok, that's all I can think of. -
I don't know of any way to do this short of using dynamic SQL. Maybe if you include a bit more information about why you feel you have to use the ordinal values someone on here can give you advice on how to get around that problem.
EDIT: I see that you answered this to some degree in another comment. Can you provide more specifics? The import proc and/or table definitions?
-
If you are using MS SQL 2005 you can use the ROW_NUMBER function.
SELECT Col1, Col2, ROW_NUMBER() OVER(ORDER BY Col1) FROM Test WHERE ROW_NUMBER() Over(Order BY Col1) Between @Position AND @Position
That should get you the desired results if I am reading the question correctly.
0 comments:
Post a Comment