Asp.net 如何根据列在表中的顺序选择列

Asp.net 如何根据列在表中的顺序选择列,asp.net,sql,sql-server-2008,oracle11g,Asp.net,Sql,Sql Server 2008,Oracle11g,我想根据列的顺序从表中选择列 像 假设我不知道第二列的名称 我怎样才能做到: Select Col1,Col2 From Product 你总能做到 select * from Product 你总能做到 select * from Product 对于SQL Server: 您不能在SELECT子句中执行此操作。不能根据列的订单号进行选择。您必须列出需要显式选择的列的名称,否则,请使用select*列出所有列。如果您使用数据读取器对象或任何其他ado.net方法从数据库获取数据,您可以执

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

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

我怎样才能做到:

Select Col1,Col2 From Product
你总能做到

select * from Product
你总能做到

select * from Product

对于SQL Server:

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

但是,您可以通过从
information\u schema.columns
中读取列的元数据
ordinal\u position
动态执行类似操作,如下答案所述:

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

SELECT *
FROM TableName
ORDER BY 2; -- for col2
但不建议在按
顺序或在选择(如果有)中使用此选项。此外,列顺序在关系模型中并不重要

更新:如果要从传递到存储过程的任何表参数中选择至少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; 

对于SQL Server:

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

但是,您可以通过从
information\u schema.columns
中读取列的元数据
ordinal\u position
动态执行类似操作,如下答案所述:

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

SELECT *
FROM TableName
ORDER BY 2; -- for col2
但不建议在按
顺序或在选择(如果有)中使用此选项。此外,列顺序在关系模型中并不重要

更新:如果要从传递到存储过程的任何表参数中选择至少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; 

我想分享以下代码,作为表中顺序位置上CRUD处理的解决方案。我今天遇到了这个问题,我花了很长时间研究并找到了一个有效的解决方案。许多已发布的答案表明,不可能按顺序与表列交互,但如上文所述,使用信息_schema表将允许使用列位置

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

Pivot视图用于构建Staging表,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
Declare@colname Varchar(55)——列名
声明@ordpos INT--顺序位置
声明@Item Varchar(99)——PK
声明@i INT——计数器
声明@cnt INT--Count
声明@ids表(idx int identity(1,1),项Varchar(25))
--项目清单
将DBName.Schema.TableName中的Select项插入到@ids中
从@ids中选择@i=min(idx)-1、@cnt=max(idx)
--行循环
而@i<@cnt
开始
选择@i=@i+1
设置为@ordpos=3
设置@Item=(从@ids中选择Item,其中idx=@i)
--列循环
而@ordpos<27
开始
从INFORMATION_SCHEMA.Columns中选择@colname=column_name,其中table_name='TargetTable'和ordinal_position=@ordpos
Exec('Update TARGETABLE set['+@colname+']=(从StagingTable中选择['+@colname+'],其中Item='''+@Item+''),其中Item=''+@Item+''))
设置@ordpos=@ordpos+1
End—End列循环
结束——结束行循环
这里的代码将按行和列在项目矩阵中循环,并使用动态SQL来构建操作,在本例中,操作是一个更新,但也可以很容易地作为一个选择。每一列都通过While循环进行处理,然后通过下一行进行循环。这允许在(项目X YearMonth)之前更新矩阵中的特定单元格,而实际上不知道给定位置的列名

            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
一个值得关注的问题是