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