在SQL Server存储过程中按索引而不是名称访问表的列

cMi*_*nor 6 sql t-sql sql-server ordinal sql-server-2008

有没有办法在SQL Server的存储过程中通过索引访问列?

目的是计算大量列.我正在阅读关于游标的内容,但我不知道如何应用它们.

让我解释一下我的问题:

我有一排像:

field_1 field_2 field_3 field_4 ...field_d  Sfield_1 Sfield_2 Sfield_3...Sfield_n
1       2       3       4          d        10       20       30         n
Run Code Online (Sandbox Code Playgroud)

我需要计算类似的东西 (field_1*field1) - (Sfield_1* Sfiled_1) / more...

因此结果存储在表列中d次.

所以结果就是一张d column * d row桌子.

由于列数是可变的,我正在考虑制作动态SQL,在字符串中获取列的名称并拆分我需要的列,但这种方法使问题更难.我认为通过索引获取列号可以使生活更轻松.

OMG*_*ies 6

不,您不能在SELECT子句中使用序数(数字)位置.

只有在ORDER BY子句中才能使用序数位置,因为它基于SELECT子句中指定的列.


Tho*_*mas 4

首先,正如OMG Ponies所说,您不能按列的序号位置引用列。这不是意外。SQL 规范不是为 DDL 或 DML 中的动态模式构建的。

鉴于此,我不得不想知道为什么你的数据结构如此。当您尝试提取信息时,模式与问题域之间不匹配的迹象就会出现。当查询编写起来非常麻烦时,就表明该模式没有正确地对其设计的领域进行建模。

然而,无论如何,鉴于您告诉我们的内容,替代解决方案将类似于以下内容:(我假设这field_1*field1意味着是field_1 * field_1field_1平方 或Power( field_1, 2 )

Select 1 As Sequence, field_1 As [Field], Sfield_1 As [SField], Sfiled_1 As [SFiled]
Union All Select 2, field_2, Sfield_2, Sfiled_2
...
Union All Select n, field_n, Sfield_n, Sfiled_n
Run Code Online (Sandbox Code Playgroud)

现在您的查询如下所示:

With Inputs As
    (
    Select 1 As Sequence, field_1 As [Field], Sfield_1 As [SField], Sfiled_1 As [SFiled]
    Union All Select 2, field_2, Sfield_2, Sfiled_2
    ....
    )
    ,  Results As
    (
    Select Case
            When Sequence = 1 Then Power( [Field], 2 ) - ( [SField] * [SFiled] ) 
            Else 1 / Power( [Field], 2 ) - ( [SField] * [SFiled] ) 
            End
            As Result
    From Inputs
    )
Select Exp( Sum( Log( Result ) ) )
From Results
Run Code Online (Sandbox Code Playgroud)