Как выбрать динамический строковый результат SQL с помощью OPENROWSET или SomeFunction в SQL Server - PullRequest
2 голосов
/ 23 мая 2019

Мой ожидаемый запрос:

with cte as 
(
    select 'select 1 + 2' tSql 
    union all
    select 'select 1 * 2' tSql
)
select somefunction(tsql) as val
from cte

Результат:

val
3
2

Я пытался сделать это, используя:

  1. Использовать OPENROWSET:

Я использую OPENROWSET могу получить динамический строковый результат SQL

SELECT * 
FROM OPENROWSET('SQLNCLI','Server=(local);Trusted_Connection=yes;','select 1+2') --result : 3

но я получаю эту ошибку SQL

Сообщение 7314, Уровень 16, Состояние 1, Строка1
Поставщик OLE DB "SQLNCLI" для связанного сервера "(локальный)" не содержит таблицу tSql.Таблица либо не существует, либо текущий пользователь не имеет разрешений для этой таблицы.

with cte as 
(
    select 'select 1 + 2' tSql 
    union all
    select 'select 1 * 2' tSql
)
select (SELECT * FROM OPENROWSET('SQLNCLI','Server=(local);Trusted_Connection=yes;',tSql)) as val
from cte

Я проверяю, что документ msdn дает проблемную точку:

enter image description here

2.Использование sp_executesql:

create function F_SqlToNumeric(@sql nvarchar(max))
returns numeric(20,8) as 
begin
    declare @v numeric(20,8);
    select @sql = N'select @v_out = ('+@sql+')';
    exec sp_executesql @sql,N'@v_out numeric(20,8) output',@v_out = @v output
    return @v
end;
with cte as 
(
    select 'select 1 + 2' tSql 
    union all
    select 'select 1 * 2' tSql
)
select F_SqlToNumeric(tSql) as val
from cte

Я получаю ошибку:

Ошибка 557, только функции ирасширенные хранимые процедуры могут быть выполнены из функции.

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