是否可以使用 ordinal_position 为表列选择列数据?我知道使用序数位置是一种不好的做法,但对于一次性数据导入过程,我需要能够使用序数位置来获取列数据。
所以例如
create table Test(
Col1 int,
Col2 nvarchar(10)
)
而不是使用
select Col2 from Test
我可以写吗
select "2" from Test -- for illustration purposes only
是否可以使用 ordinal_position 为表列选择列数据?我知道使用序数位置是一种不好的做法,但对于一次性数据导入过程,我需要能够使用序数位置来获取列数据。
所以例如
create table Test(
Col1 int,
Col2 nvarchar(10)
)
而不是使用
select Col2 from Test
我可以写吗
select "2" from Test -- for illustration purposes only
如果您知道列的数量,但不知道其名称和类型,则可以使用以下技巧:
select NULL as C1, NULL as C2 where 1 = 0
-- Returns empty table with predefined column names
union all
select * from Test
-- There should be exactly 2 columns, but names and data type doesn't matter
结果,您将拥有一个包含 2 列 [C1] 和 [C2] 的表。如果表中有 100 列,此方法不是很有用,但它适用于预定义列数较少的表。
你必须做类似的事情
declare @col1 as varchar(128)
declare @col2 as varchar(128)
declare @sq1 as varchar(8000)
select @col1 = column_name from information_schema.columns where table_name = 'tablename'
and ordinal_position = @position
select @col2 = column_name from information_schema.columns where table_name = 'tablename'
and ordinal_position = @position2
set @sql = 'select ' + col1 ',' + col2 'from tablename'
exec(@sql)
您可以使用此查询
select * from information_schema.columns
获取列的序数位置。就像 Michael Haren 所写的那样,您必须使用它来构建一个动态查询,无论是在代码中还是在将列位置传递给的存储过程中。
FWIW,这是纯粹的邪恶。
另外,deathofrats 是对的,您不能真正做到这一点,因为您将根据位置构建一个带有列名的常规查询。
是的,您可以通过对系统表的一些非常丑陋的点击来做到这一点。您可能需要进入动态 sql 的世界。
我真的,真的不推荐这种方法。
如果那没有阻止您,那么这可能会让您开始(参考):
select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
不,据我所知,您不能根据它们的顺序位置选择列。
在查看事务 SQL 参考时,没有任何建议可以 ( http://msdn.microsoft.com/en-us/library/ms176104(SQL.90).aspx )。
如果您知道列数,一种方法可能是将数据传输到具有该列数的 tmp 表中,然后从临时表中选择...
declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant)
insert into @tmp
select * from Test
select field2 from @tmp
您可以选择使用条件:在您的示例中:
SELECT
CASE YourColumnNumber
WHEN "1" THEN Col1
WHEN "2" THEN Col2
ELSE "?"
END AS Result
FROM Test
恐怕去模式会减慢查询速度......
我不认为你可以。正如@Michael Haren 所示,您可以在 ORDER BY 子句中使用序数位置,但我从未见过它们在 SQL Server 的其他地方使用过。
我不确定你的一次性数据导入有什么问题,这将有助于解决 - 大概是一些不幸的列名?你能再解释一下吗?
除了使用动态 SQL,我不知道有什么方法可以做到这一点。也许如果你包含更多关于为什么你觉得你必须使用这里的序数值的信息,那么有人可以就如何解决这个问题给你建议。
编辑:我看到你在另一条评论中在某种程度上回答了这个问题。你能提供更多细节吗?导入过程和/或表定义?
如果您使用的是 MS SQL 2005,您可以使用 ROW_NUMBER 函数。
SELECT Col1, Col2, ROW_NUMBER() OVER(ORDER BY Col1) FROM Test WHERE ROW_NUMBER() Over(Order BY Col1) 在@Position 和 @Position 之间
如果我正确阅读了问题,那应该会给您带来理想的结果。