如何在SQL Server中通过OPENROWSET或SomeFunction选择动态字符串SQL结果

时间:2019-05-23 02:01:33

标签: sql sql-server

我期望的查询:

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级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 doc得到的问题点是:

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,只能从函数中执行函数和扩展存储过程。

0 个答案:

没有答案