una - ¿Es posible seleccionar datos del servidor SQL utilizando la posición ordinal de la columna?
sql server porque no está contenida en una función de agregado ni en la cláusula group by (10)
¿Es posible seleccionar datos de columna usando la posición ordinal para una columna de tabla? Sé que usar posiciones ordinales es una mala práctica, pero para un proceso de importación de datos único, necesito poder usar la posición ordinal para obtener los datos de la columna.
Así por ejemplo
create table Test(
Col1 int,
Col2 nvarchar(10)
)
En lugar de usar
select Col2 from Test
Puedo escribir
select "2" from Test -- for illustration purposes only
No creo que puedas. Como mostró @Michael Haren, puede usar posiciones ordinales en cláusulas ORDER BY, pero nunca las he visto en otro lugar de SQL Server.
No estoy seguro de qué problema está teniendo con su importación de datos únicos que esto ayudaría con - ¿presumiblemente algún desafortunado nombre de columna? ¿Puedes explicar un poco más?
No sé de ninguna manera de hacer esto sin usar SQL dinámico. Tal vez si incluye un poco más de información sobre por qué siente que tiene que usar los valores ordinales, alguien aquí puede darle consejos sobre cómo solucionar ese problema.
EDIT: veo que respondiste esto hasta cierto punto en otro comentario. ¿Puedes proporcionar más detalles? ¿El proceso de importación y / o las definiciones de tabla?
No, no puedes seleccionar columnas basadas en su posición ordinal, hasta donde yo sé.
Al consultar la referencia de Transact SQL, no hay nada que sugiera que pueda ( http://msdn.microsoft.com/en-us/library/ms176104(SQL.90).aspx ).
Puedes usar esta consulta
select * from information_schema.columns
para obtener las posiciones ordinales de las columnas. Al igual que Michael Haren escribió, tendrá que crear una consulta dinámica usando esto, ya sea en código o en un sproc al que le pase las posiciones de las columnas.
FWIW, esto es puro mal.
Además, los informes de defunción son correctos, en realidad no se puede hacer, ya que se creará una consulta regular con los nombres de las columnas en función de la posición.
Sí, puedes hacer esto con algunos hits realmente feos en las tablas del sistema. Probablemente necesites caer en el mundo del sql dinámico.
Realmente, realmente no recomiendo este enfoque.
Si eso no lo detuvo, entonces esto podría ayudarlo a comenzar ( ref ):
select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
Si conoce la cantidad de columnas, pero no conoce sus nombres y tipos, puede usar el siguiente truco:
select NULL as C1, NULL as C2 where 1 = 0
-- Returns empty table with predefined column names
union all
select * from Test
-- There should be exactly 2 columns, but names and data type doesn''t matter
Como resultado, tendrá una tabla con 2 columnas [C1] y [C2]. Este método no es muy útil si tiene 100 columnas en su tabla, pero funciona bien para tablas con un pequeño número predefinido de columnas.
Si conoce la cantidad de columnas, una forma podría ser transferir los datos a una tabla tmp con ese número de columnas y seleccionar desde la tabla temporal ...
declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant)
insert into @tmp
select * from Test
select field2 from @tmp
Si está utilizando MS SQL 2005, puede usar la función ROW_NUMBER.
SELECCIONE Col1, Col2, ROW_NUMBER () OVER (ORDER BY Col1) FROM Prueba WHERE ROW_NUMBER () Over (Order BY Col1) entre @Position AND @Position
Eso debería darte los resultados deseados si estoy leyendo la pregunta correctamente.
Tendría que hacer algo como
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 = @position2
set @sql = ''select '' + col1 '','' + col2 ''from tablename''
exec(@sql)
Una opción que tienes es usar condiciones: en tu ejemplo:
SELECT
CASE YourColumnNumber
WHEN "1" THEN Col1
WHEN "2" THEN Col2
ELSE "?"
END AS Result
FROM Test
Ir al esquema ralentizará la consulta, me temo ...