sql server按编号选择列

时间:2013-07-26 15:44:34

标签: sql sql-server sql-server-2008

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

这样的东西
SELECT columns(0), columns(3), columns(5), columns(8) FROM TABLE

由于

5 个答案:

答案 0 :(得分:6)

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

此语句返回表格的第三列

您需要编写像

这样的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

答案 1 :(得分:4)

我强烈建议不要这么复杂的答案。

正如其他人已经在你的问题下面指出的那样,你应该看看这个答案:

Access columns of a table by index instead of name in SQL Server stored procedure

  

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

接受它,不要在SELECT中使用数字作为列。它会降低性能,降低可读性,如果更改架构,它将明显失败。

答案 2 :(得分: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 

答案 3 :(得分: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

(从#YourTable中选择F1,F2,F3,F4,F5,F6,F7,F8,F9,F10)AS cp

UNPIVOT

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

124000

124001

124002

124003

124004

124005

124006

124007

124008

124009

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

创建表#JobNos2(JobNo int,Row int)

插入#JobNos2

从#JobNos1中选择SELECT JobNo,ROW_NUMBER()OVER(ORDER BY(SELECT 100))AS行

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

SET @jobno =从#JobNos2中选择JobNo,其中Row = @SomeRowNumber

答案 4 :(得分: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