Конвертировать строку в SQL-выражение для каждой строки - PullRequest
0 голосов
/ 31 мая 2019

Здравствуйте, я много искал это, и я не смог найти хорошее решение для этого.

Представим, что у меня есть следующий запрос

Select width, height, depth, formula from myTable

Я хочу сделать замену вформула для преобразования w в значения ширины h в значения высоты d в значения глубины

, а затем я хочу преобразовать эту результирующую строку ex: '(1 + 2) * 3' в выражение, чтобы оно вычислялось.

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

exec ('select '+@expression)

Но это не работает для каждой строки.Я просто не могу использовать exec внутри выбора.Как это

select 1 as col1, exec ('select '+@expression) as col2

Или даже преобразовать строку в выражение что-то вроде

Cast('1+1' as expression) 

Конечный результат, который мне нужен, прост.следует ниже.

+-------+--------+-------+---------+--------+
| width | height | depth | formula | result |
+-------+--------+-------+---------+--------+
| 1     | 2      | 3     | (w+h)*d | 12     |
+-------+--------+-------+---------+--------+
| 2     | 1      | 3     | d+d*h   | 6      |
+-------+--------+-------+---------+--------+
| 3     | 3      | 1     | (d/4)*d | 0.25   |
+-------+--------+-------+---------+--------+

1 Ответ

0 голосов
/ 31 мая 2019

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

объявляет @sql nvarchar (макс.);

объявлять @id int = 0; объявить @maxid int;

выберите @maxid = max (id) из mytable;

while @id < @maxid
begin
    select @sql = concat('select ', width, ' as width, ', height, ' as height, ', depth, ' as depth, ', formula, ' as value, ''', formula + ''' as formula',
                  ' from (select ', width, ' as w, ', height, ' as h, ', depth, 'as d) x')
    from mytable t
    order by id
    offset @id rows fetch next 1 row only;

    exec sp_executesql @sql;

    set @id = @id + 1;
end;

Здесь - это дБ <> скрипка.

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