varios una sumar solo repetidos registros porque por función está elementos ejemplos contenida cláusula campos campo agrupar agrupacion agregado sql sql-server sql-server-2005 tsql ordinals

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?



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 ...