sql server 按数字选择列

问题描述 投票:0回答:6

我可以根据SQL中的列数选择特定列吗? 类似的东西

SELECT columns(0), columns(3), columns(5), columns(8) FROM TABLE
sql sql-server sql-server-2008
6个回答
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
投票

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

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

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

SQL 规范不是为 DDL 或 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 

0
投票

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

F1 F2 F3 F4 F5 F6 F7 F8 F9 F10

124000 124001 124002 124003 124004 124005 124006 124007 124008 124009

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

选择作业编号到#JobNos1 FROM

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

取消旋转

(JobNos 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 = 从 #JobNos2 中选择 JobNo,其中 Row = @SomeRowNumber


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

0
投票

根据列号而不是列名执行 SELECT

DECLARE @cn nvarchar(100), @tmp_sql nvarchar(500)
SET @cn = ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
                        WHERE TABLE_NAME = 'YourTableName' AND ORDINAL_POSITION = '1')
SET @tmp_sql = 'SELECT ' + @cn + ' FROM YourTableName'
EXEC(@tmp_sql)

在不知道主键列名称的情况下对表执行 SELECT

DECLARE @cn nvarchar(100), @tmp_sql nvarchar(500)
SET @cn = (SELECT [COLUMN_NAME]
                    FROM [YourDBName].[INFORMATION_SCHEMA].[KEY_COLUMN_USAGE]
                    WHERE TABLE_NAME = 'YourTableName')
SET @tmp_sql = 'SELECT ' + @cn + ' FROM YourTableName'
EXEC(@tmp_sql)
© www.soinside.com 2019 - 2024. All rights reserved.