Solución:
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTable' AND ORDINAL_POSITION = '3'
Esta declaración devuelve la tercera columna de su tabla.
Debería escribir una declaración SQL transact como
DECLARE @columnname nvarchar(100), @sql nvarchar(500)
SELECT @columnname = ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'myTable' AND ORDINAL_POSITION = '3'
SET @sql="SELECT " + @columnname + ' FROM mytable'
EXEC @sql
Lo recomiendo encarecidamente contra respuestas tan complicadas.
Como otros ya señalaron debajo de su pregunta, debería consultar esta respuesta en su lugar:
Acceda a las columnas de una tabla por índice en lugar del nombre en el procedimiento almacenado de SQL Server
La especificación SQL no está construida para esquemas dinámicos, ni siquiera en DDL o DML.
Acéptelo y no use números para las columnas en SELECT. Será menos eficaz, menos legible y, obviamente, fallará si cambia el esquema.
Tienes que usar SQL dinámico para hacer esto:
DECLARE @strSQL AS nvarchar(MAX)
DECLARE @strColumnName AS nvarchar(255)
DECLARE @iCounter AS integer
DECLARE @curColumns AS CURSOR
SET @iCounter = 0
SET @strSQL = N'SELECT '
SET @curColumns = CURSOR FOR
(
SELECT * FROM
(
SELECT TOP 99999
COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'T_Markers'
AND ORDINAL_POSITION < 4
ORDER BY ORDINAL_POSITION ASC
) AS tempT
)
OPEN @curColumns
FETCH NEXT FROM @curColumns INTO @strColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
-- PRINT @strColumnName
IF @iCounter = 0
SET @strSQL = @strSQL + N'
[' + @strColumnName + N'] '
ELSE
SET @strSQL = @strSQL + N'
,[' + @strColumnName + N'] '
SET @iCounter = @iCounter + 1
FETCH NEXT FROM @curColumns INTO @strColumnName
END
CLOSE @curColumns
DEALLOCATE @curColumns
SET @strSQL = @strSQL + N'
FROM T_Markers
'
PRINT @strSQL
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)