sql server按编号选择列

Mik*_*ike 12 sql sql-server sql-server-2008

我可以按SQL中的列数选择特定列吗?就像是

SELECT columns(0), columns(3), columns(5), columns(8) FROM TABLE
Run Code Online (Sandbox Code Playgroud)

谢谢

Bru*_*ten 7

SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'myTable' AND ORDINAL_POSITION = '3'
Run Code Online (Sandbox Code Playgroud)

此语句返回表的第三列

您需要编写一个transact SQL语句,如

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
Run Code Online (Sandbox Code Playgroud)


Fab*_*ler 5

我强烈建议您不要回答如此复杂的答案。

正如其他人已经在您的问题下方指出的那样,您应该改用以下答案:

通过索引而不是SQL Server存储过程中的名称访问表的列

SQL规范不是为DDL或DML中的动态模式构建的。

接受它,不要对SELECT中的列使用数字。如果更改架构,它将导致性能降低,可读性下降,并且显然会失败。


Ste*_*ger 3

您必须使用动态 SQL 来执行此操作:

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 
Run Code Online (Sandbox Code Playgroud)