7

有没有办法在 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

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

所以结果存储在一个表列d次。

所以结果是一个d column * d row表格。

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

4

3 回答 3

7

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

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

于 2011-02-03T05:37:36.413 回答
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

现在您的查询如下所示:

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
于 2011-02-03T06:34:29.737 回答
0

这可能不是最优雅或最有效的,但它确实有效。我正在使用它来创建一个新表,以便在需要解析所有列/行的数据之间进行更快的映射。

DECLARE @sqlCommand varchar(1000)
DECLARE @columnNames TABLE (colName varchar(64), colIndex int)
DECLARE @TableName varchar(64) = 'YOURTABLE' --Table Name
DECLARE @rowNumber int = 2 -- y axis
DECLARE @colNumber int = 24 -- x axis

DECLARE @myColumnToOrderBy varchar(64) = 'ID' --use primary key

--Store column names in a temp table
INSERT INTO @columnNames (colName, colIndex)
SELECT COL.name AS ColumnName, ROW_NUMBER() OVER (ORDER BY (SELECT 1))
    FROM sys.tables AS TAB
    INNER JOIN sys.columns AS COL ON COL.object_id = TAB.object_id
    WHERE TAB.name = @TableName
    ORDER BY COL.column_id;

DECLARE @colName varchar(64)
SELECT @colName = colName FROM @columnNames WHERE colIndex = @colNumber

--Create Dynamic Query to retrieve the x,y coordinates from table
SET @sqlCommand = 'SELECT ' + @colName + ' FROM (SELECT ' + @colName + ', ROW_NUMBER() OVER (ORDER BY ' + @myColumnToOrderBy+ ') AS RowNum FROM ' + @tableName + ') t2 WHERE RowNum = ' + CAST(@rowNumber AS varchar(5))
EXEC(@sqlCommand)
于 2016-10-27T08:40:21.563 回答