1

我想根据它的顺序从表中选择列

create Table Products
(
  ProductId Int,
  ProductName varchar(50)
)

假设我不知道第二列的名称。

我怎么能得到它:

Select Col1,Col2 From Product
4

3 回答 3

3

对于 SQL Server:

您不能在SELECT子句中执行此操作。不能根据列的序号进行选择。您必须列出需要明确选择的列名,否则,请使用SELECT *列出所有。我是,如果您使用数据读取器对象或任何其他 ado.net 方法从数据库中获取数据,您可以执行类似的操作,但这将基于您的 SQL 语句中列出的列名列表。

但是,您可以通过从以下答案中读取列的元数据ordinal_positioninformation_schema.columns动态地执行此类操作:

但是,您可以在ORDER BY子句中执行此操作。您可以ORDER BY列号:

SELECT *
FROM TableName
ORDER BY 2; -- for col2

但这不建议在 inORDER BY或 in SELECT(如果有的话) 中使用。此外,列顺序在关系模型中并不重要。

更新:如果要从传递给存储过程的任何表参数中选择至少 3 列。试试这个:

您的存储过程应该接收一个参数@tableNameParam。以下代码应返回传递给存储过程的前三列:@tablenameParam

DECLARE @col1 AS VARCHAR(100);
DECLARE @col2 AS VARCHAR(100);
DECLARE @col3 AS VARCHAR(100);
DECLARE @tableNameParam AS VARCHAR(50) = 'Tablename';

DECLARE @sql AS VARCHAR(MAX) ;

SELECT @col1 = column_name FROM information_schema.columns 
                           WHERE table_name = @tableNameParam
                             AND ordinal_position = 1;

SELECT @col2 = column_name FROM information_schema.columns 
                           WHERE table_name = @tableNameParam;
                             AND ordinal_position = 2;

SELECT @col3 = column_name FROM information_schema.columns 
                           WHERE table_name = @tableNameParam;
                             AND ordinal_position = 3;

SET @sql = 'SELECT ' + col1 + ',' + col2 ' + 'col3 ' + FROM ' + @tablename; 
于 2012-11-13T11:57:09.210 回答
2

你总能做到

select * from Product
于 2012-11-13T11:55:22.523 回答
0

我想分享以下代码作为对表格中序数位置进行 CRUD 处理的解决方案。我今天遇到了这个问题,我花了很长时间研究并找到一个可行的解决方案。许多发布的答案表明不可能与序数基础上的表列进行交互,但如上面的帖子中所示,使用 information_schema 表将允许使用列位置。

我的情况是与通过使用透视视图填充的表进行交互,因此列总是根据数据而变化,这在视图结果中很好,但是当数据集存储到表中时,列是动态的。列名是年-月组合,例如 201801、201802,以项目编号作为主键。此数据透视表用于在滚动的 12 个月期间按年到月指示制造数量,因此每个月的列名称都带有更改/移位,这会在每个月重建表时更改其序数位置。

Pivot 视图用于构建 Staging 表,Staging 表用于构建 Target 表,因此 staging 表和目标表的序号位置与相同的序号位置对齐。

            Declare @colname    Varchar(55) -- Column Name
            Declare @ordpos     INT         -- Ordinal Position
            Declare @Item       Varchar(99) -- PK
            Declare @i          INT         -- Counter
            Declare @cnt        INT         -- Count
            Declare @ids        table(idx int identity(1,1), Item Varchar(25))
        -- Item List
                Insert INTO @ids Select Item From DBName.Schema.TableName   
                    select @i = min(idx) - 1, @cnt = max(idx) from @ids
        -- Row Loop
                While @i < @cnt
                Begin
                    Select @i = @i + 1
                    Set @ordpos=3
                    Set @Item = (select Item from @ids where idx = @i)
        --   Column Loop
                    While @ordpos < 27
                        Begin
                            Select @colname =column_name From INFORMATION_SCHEMA.Columns Where table_name='TargetTable' and ordinal_position=@ordpos
                            Exec ('Update TargetTable set ['+@colname+']= (Select ['+@colname+'] From StagingTable Where Item='''+@Item+''')         where Item='''+@Item+'''')
                            Set @ordpos=@ordpos + 1
                        End -- End Column Loop
                End -- End Row Loop

此处的代码将按行和按列循环遍历 Item 矩阵,并使用动态 SQL 来构建操作,在这种情况下,操作是更新,但它也可以很容易地成为选择。通过 While 循环处理每一列,然后循环下一行。这允许通过 (Item X YearMonth) 更新矩阵中的特定单元格,而无需实际知道给定位置的列名称。

一个问题是,根据该矩阵中数据的大小,它可能会很慢。我只是想将其展示为在序数位置使用未知列名的一种方式。

于 2018-12-04T16:36:43.053 回答