我想根据其订单从表中选择列 喜欢
create Table Products
(
ProductId Int,
ProductName varchar(50)
)
让我说我不知道第二列的名称。
我怎么能这样:
Select Col1,Col2 From Product
答案 0 :(得分:3)
对于SQL Server:
您无法在SELECT
子句中执行此操作。您无法根据列的订单号进行选择。您必须列出需要明确选择的列名称,否则,使用SELECT *
列出所有列。如果您使用数据读取器对象或任何其他ado.net方法从数据库获取数据,您可以执行类似的操作,但这将基于SQL语句中列出的列名列表。
但是,您可以通过从ordinal_position
读取列的元数据information_schema.columns
来动态执行此操作,如以下答案中所述:
但是,您可以在ORDER BY
子句中执行此操作。您可以ORDER BY
列号:
SELECT *
FROM TableName
ORDER BY 2; -- for col2
但建议不要在ORDER BY
或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;
答案 1 :(得分:2)
你总能做到
select * from Product
答案 2 :(得分:0)
我想分享以下代码,作为对表内Ordinal Position进行CRUD处理的解决方案。我今天遇到了这个问题,花了我很长时间研究和找到可行的解决方案。许多发布的答案表明,无法与Ordinal基础上的表列进行交互,但如上一博文所述,使用information_schema表可以允许使用列位置。
我的情况是与使用枢轴视图填充的表进行交互,因此列始终根据数据而变化,这在视图结果中很好,但是当数据集存储在表中时,列是动态的。列名称是“年-月”组合,例如201801、201802,其中项目编号为主键。该数据透视表用于在12个月的滚动月份中按年/月指示制造数量,因此每个月的列名称都会发生更改/班次,这会在每月重建表时更改其顺序位置。
“数据透视”视图用于构建暂存表,“暂存”表用于构建暂存表 目标表,以便将登台表和目标表的顺序位置排列在相同的顺序位置上。
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矩阵,并使用Dynamic SQL来构建操作,在这种情况下,该操作是更新,但也可以很容易地被选择。每列都通过While循环进行处理,然后遍历下一行。这样就可以按(Item X YearMonth)更新矩阵中的特定单元格,而无需实际知道给定位置的列名。
一个令人担心的问题是,根据此矩阵中数据的大小,它可能很慢。我只是想将其显示为在顺序位置使用未知列名称的方法。