SQL Server 按列编号选择列

15

我能否通过列的编号在SQL中选择特定的列?就像这样

SELECT columns(0), columns(3), columns(5), columns(8) FROM TABLE

2
请查看以下链接:https://dev59.com/NnRC5IYBdhLWcg3wOeaB - Yuriy Galanter
1
看看这个答案,它可能是你要找的答案 https://dev59.com/iVPTa4cB1Zd3GeqPoPpC#4883109 - Elias
这里有一个与你的问题类似且有完美答案的问题:https://dev59.com/iVPTa4cB1Zd3GeqPoPpC - gwt
1
不行。SQL不允许在"select"子句中这样做。 - Gordon Linoff
似乎是 http://xyproblem.info/。提出一个真正的问题。 - David דודו Markovitz
这回答解决了您的问题吗?是否可能使用列序号位置选择SQL Server数据 - philipxy
5个回答

9
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'myTable' AND ORDINAL_POSITION = '3'

这个语句返回表中的第三列。
您需要编写像传递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

6
我强烈建议不要使用如此复杂的答案。正如其他人已经在您的问题下面指出的,您应该查看这个答案:Access columns of a table by index instead of name in SQL Server stored procedure
引用:“SQL规范既不能在DDL(数据定义语言)中也不能在DML(数据操作语言)中支持动态模式。”
接受它,不要使用数字来选择列。这样会降低性能,降低可读性,并且显然在更改模式时会失败。

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 

0

使用UNPIVOT将列转换为行。操作如下:

F1 F2 F3 F4 F5 F6 F7 F8 F9 F10

124000 124001 124002 124003 124004 124005 124006 124007 124008 124009

-- 将表格#JobNos1中的列转换为行

SELECT JobNo INTO #JobNos1 FROM

(SELECT F1, F2, F3, F4, F5, F6, F7, F8, F9, F10 FROM #YourTable) AS cp

UNPIVOT

(JobNo FOR JobNos IN (F1, F2, F3, F4, F5, F6, F7, F8, F9, F10)) AS up

124000

124001

124002

124003

124004

124005

124006

124007

124008

124009

-- 需要一种选择行的方法,因此将行号添加到#JobNos2中

CREATE TABLE #JobNos2(JobNo int, Row int)

INSERT INTO #JobNos2

SELECT JobNo, ROW_NUMBER() OVER (ORDER BY (SELECT 100)) AS Row from #JobNos1

然后您可以执行以下操作:

SET @jobno = SELECT JobNo from #JobNos2 where Row = @SomeRowNumber


1
这个回答似乎与所问的问题不相关。 - Coder

0

我用这个查询做了

declare @colCoun int
SELECT  @colCoun =COUNT(*)   -- get column count in your table
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_catalog = 'YOUR_DB_NAME'    AND table_name = 'YOUR_TABLE'

CREATE TABLE #temp([1] VARCHAR(max))

if(@colCoun>1) 
BEGIN           
DECLARE @cnt INT = 2;
WHILE @cnt <= @colCoun    
 BEGIN
 Exec ('ALTER TABLE #temp ADD ['+ @cnt +'] varchar(max)')
 SET @cnt = @cnt + 1;
 END
END

insert into #temp
select * from YOUR_TABLE

select [1],[2] from #temp -- select your own column number in range of table

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接