【问题标题】:sql server select column by numbersql server 按数字选择列
【发布时间】:2013-07-26 15:44:33
【问题描述】:

我可以通过 SQL 中的列数来选择特定的列吗? 类似的东西

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

【问题讨论】:

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


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    我强烈反对这种复杂的答案。

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

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

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

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

    【讨论】:

      【解决方案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 
      

      【讨论】:

        【解决方案4】:

        使用 UNPIVOT 将列转换为行。是这样的:

        F1 F2 F3 F4 F5 F6 F7 F8 F9 F10

        124000 124001 124002 124003 124004 124005 124006 124007 124008 124009

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

        从#JobNos1 中选择作业编号

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

        反透视

        (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

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

        插入#JobNos2

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

        然后你可以这样做:

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

        【讨论】:

        • 这个答案似乎与所问的问题无关
        【解决方案5】:

        我对这个查询做了

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-13
          • 1970-01-01
          相关资源
          最近更新 更多