Передача «текущей» строки в функцию в SQL Server - PullRequest
7 голосов
/ 10 января 2011

Я не совсем уверен, как спросить это, но позвольте мне спросить на примере:

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

(rd.Count_R10 * 10) + (rd.Count_R20 * 20) + (rd.Count_R50 * 50) + (rd.Count_R100 * 100) + (rd.Count_R200 * 200)

Я хотел бы написать функцию T-SQL, которая дает мне эту общую стоимость, но для любой строки, а не длявесь запрос, поэтому моя функция будет выглядеть примерно так:

CREATE FUNCTION DepositTotal
(
    @row ????
)
RETURNS money
AS
BEGIN   
    RETURN (row.Count_R10 * 10) + (row.Count_R20 * 20) + (row.Count_R50 * 50) + (row.Count_R100 * 100) + (row.Count_R200 * 200)
END

Тогда я бы назвал это примерно так:

select
      DepositDate
    , DepositTotal(thisRow)
    , BatchId
from Deposits

Ответы [ 3 ]

6 голосов
/ 10 января 2011

Должно ли решение быть функцией?Или ограничивающим фактором является то, что вы не можете изменить структуру таблицы?Вы можете написать представление над таблицей, которое добавляет столбец с вашим общим значением ..

CREATE VIEW DepositsWithTotal

select
  Deposits.* -- Expand this - I just don't know your schema
, DepositTotal = (Count_R10 * 10) + (Count_R20 * 20) + (Count_R50 * 50) + (Count_R100 * 100) + (Count_R200 * 200)

from Deposits

Затем просто выберите из DepositsWithTotal вместо Deposits

2 голосов
/ 10 января 2011

Это было бы полезно для модульного кода, но определенно невозможно с функциями TSQL.

Единственный способ сделать это с использованием UDF - это передать PK строки и заставить функциюнайдите его (неэффективно) или передайте все значения по отдельности (громоздко).

Возможно, стоит предложить предложение для сайта Microsoft Connect, хотя я только что видел ответ Бретта и действительно Views или ComputedСтолбцы, кажется, предоставляют эту функциональность.

1 голос
/ 10 января 2011

Вы можете использовать табличную функцию для передачи строки в функцию (SQL Server 2008 и более поздние версии). Я думаю, что обычная скалярная функция была бы лучшей альтернативой в вашем случае.

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