Доступ к столбцам таблицы по индексу вместо имени в хранимой процедуре SQL Server - PullRequest
6 голосов
/ 03 февраля 2011

Есть ли способ получить доступ к столбцам по их индексу в хранимой процедуре в 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

Iнужно вычислить что-то вроде (field_1*field1) - (Sfield_1* Sfiled_1) / more...

Таким образом, результат сохраняется в столбце таблицы d раз.

Таким образом, результатом является d column * d row таблица.

Какчисло столбцов является переменным, я подумывал о том, чтобы сделать динамический SQL, получить имена столбцов в строке и разделить те, которые мне нужны, но такой подход усложняет задачу.Я думал, что получение номера столбца по индексу может облегчить жизнь.

Ответы [ 3 ]

6 голосов
/ 03 февраля 2011

Нет, вы не можете использовать порядковую (числовую) позицию в предложении SELECT.

Только в предложении ORDER BY вы можете использовать порядковый номер, поскольку он основан на столбцах, указанных в предложении SELECT.

3 голосов
/ 03 февраля 2011

Во-первых, как указано OMG Ponies , вы не можете ссылаться на столбцы по их порядковому положению. Это не случайность. Спецификация SQL не построена для динамической схемы ни в DDL, ни в DML.

Учитывая это, я должен задаться вопросом, почему ваши данные структурированы так, как вы. Признак несоответствия между схемой и проблемным доменом проявляется при попытке извлечь информацию. Когда запросы невероятно громоздки для написания, это указывает на то, что схема неправильно моделирует домен, для которого она была разработана.

Однако, как бы то ни было, учитывая то, что вы сказали нам, альтернативное решение будет примерно таким: (я предполагаю, что field_1*field1 должен был быть field_1 * field_1 или field_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
0 голосов
/ 27 октября 2016

Это может быть не самым элегантным или эффективным, но это работает.Я использую его для создания новой таблицы для более быстрого сопоставления данных, которые мне нужны для анализа всех столбцов / строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...