是否可以使用表列的ordinal_position选择列数据?我知道使用序数位置是一种不好的做法,但对于一次性数据导入过程,我需要能够使用序数位置来获取列数据。
所以例如
create table Test(
Col1 int,
Col2 nvarchar(10)
)
而不是使用
select Col2 from Test
我可以写
select "2" from Test -- for illustration purposes only
答案 0 :(得分:14)
你必须做类似
的事情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)
答案 1 :(得分:11)
如果你知道列的数量,但不知道它的名称和类型,你可以使用以下技巧:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionModeOverlay">true</item>
<item name="android:windowActionModeOverlay">true</item>
</style>
因此,您将拥有一个包含2列[C1]和[C2]的表。 如果表中有100列,则此方法不是很有用,但它适用于预定义列数较少的表。
答案 2 :(得分:6)
您可以使用此查询
select * from information_schema.columns
获取列的序数位置。就像迈克尔哈伦写的那样,你必须使用它来构建一个动态查询,无论是在代码中还是在传递列位置的sproc中。
FWIW,这是纯粹的邪恶。
另外,deathofrats是对的,你不能真的这样做,因为你将根据位置构建一个具有列名的常规查询。
答案 3 :(得分:2)
是的,你可以通过系统表中的一些非常丑陋的命中来做到这一点。你可能需要陷入动态sql的世界。
我真的,真的不推荐这种方法。
如果这没有阻止你,那么这可能会让你开始(ref):
select table_name, column_name, ordinal_position, data_type
from information_schema.columns
order by 1,3
答案 4 :(得分:1)
不,据我所知,你不能根据它们的顺序位置选择列。
在查看transact SQL引用时,没有任何建议可以 (http://msdn.microsoft.com/en-us/library/ms176104(SQL.90).aspx)。
答案 5 :(得分:1)
如果您知道列数,可能有一种方法是将数据传输到具有该列数的tmp表中,并从临时表中选择...
declare @tmp table(field1 sql_variant, field2 int, field3 sql_variant)
insert into @tmp
select * from Test
select field2 from @tmp
答案 6 :(得分:0)
我认为你不能。正如@Michael Haren所示,你可以在ORDER BY子句中使用序数位置,但我从未见过它们在SQL Server的其他地方使用过。
我不确定您的一次性数据导入存在哪些问题,这可能会有所帮助 - 可能是一些不幸的列名?你能解释一下吗?
答案 7 :(得分:0)
我不知道如何做到这一点,不能使用动态SQL。也许如果你包含更多关于为什么你觉得你必须使用序数值的信息,那么这里的人可以给你关于如何解决这个问题的建议。
编辑:我看到你在另一个评论中在某种程度上回答了这个问题。你能提供更多细节吗?导入proc和/或表定义?答案 8 :(得分:0)
您拥有的选项是使用条件: 在您的示例中:
SELECT
CASE YourColumnNumber
WHEN "1" THEN Col1
WHEN "2" THEN Col2
ELSE "?"
END AS Result
FROM Test
转到架构会慢慢查询我恐怕......
答案 9 :(得分:-5)
如果您使用的是MS SQL 2005,则可以使用ROW_NUMBER函数。
SELECT Col1,Col2,ROW_NUMBER()OVER(按Col1排序) 从测试 WHERE ROW_NUMBER()Over(Order BY Col1)@Position和@Position
之间如果我正确地阅读了这个问题,那应该能得到你想要的结果。