Sql server 使用变量和OpenQuery的基于表的函数

Sql server 使用变量和OpenQuery的基于表的函数,sql-server,oracle,tsql,dynamic-sql,openquery,Sql Server,Oracle,Tsql,Dynamic Sql,Openquery,我正在尝试通过SQL server从Oracle服务器查询数据。为了以瘦客户机的方式执行此操作,我使用OpenQuery。我想构建一个基于表的函数,可以根据需要查询各种链接表。我不能很好地理解使这个工作的语法。这是我到目前为止所拥有的。非常感谢您的帮助 CREATE FUNCTION [dbo].[fnTEST]( @Table varchar (100), @Fields varchar (1000), @Condition varchar(5000) ) RETURNS @TEST

我正在尝试通过SQL server从Oracle服务器查询数据。为了以瘦客户机的方式执行此操作,我使用OpenQuery。我想构建一个基于表的函数,可以根据需要查询各种链接表。我不能很好地理解使这个工作的语法。这是我到目前为止所拥有的。非常感谢您的帮助

CREATE FUNCTION [dbo].[fnTEST](
@Table  varchar (100),
@Fields varchar (1000),
@Condition  varchar(5000)
)

RETURNS 
@TEST TABLE()

AS

BEGIN
DECLARE @OPENQUERY nvarchar(4000);
DECLARE @TSQL nvarchar(4000);

SET @OPENQUERY = 'SELECT * FROM OPENQUERY([TEST-Link],'''
SET @TSQL = 'SELECT ' + @Fields + ' FROM TEST.' + @Table + ' WHERE ' + @Condition + ''')'

EXEC (@OPENQUERY+@TSQL) 
END;
我当前遇到的错误是:

Msg 102, Level 15, State 1, Procedure fnTEST, Line 12 [Batch Start Line 7]
Incorrect syntax near ')'.

在@TEST TABLE()突出显示

rpc out启用链接服务器并将其简化为

EXEC (@sql) at [TEST-Link]

rpc out
启用链接服务器,并将其简化为

EXEC (@sql) at [TEST-Link]

出于许多原因,不推荐使用这些方法,但这里最大的一个原因是,如中所示,您不能从用户定义的函数中使用动态SQL:

在你开始之前 限制和限制
  • 用户定义的函数不能使用动态SQL或临时表。允许使用表变量


以下是这种方法的一些其他问题:

  • 您的动态SQL是可注入的。除非您了解什么是SQL注入,否则永远不要使用动态SQL
  • 使用动态sql有潜在的安全性和限制。在这种情况下,动态SQL可能没有与您的帐户相同的权限,并且可能无法使用OPENQUERY
  • 数据库和服务器可信设置的性质可能会阻止此操作
  • 恕我直言,不建议使用OPENQUERY(有些人不同意),使用链接服务器和remote EXEC命令可以更好地处理远程查询
  • 您正在尝试在此处编写“通用查询”。通用查询通常不是一个好主意,并且存在安全问题,即使在修复SQL注入问题之后也是如此。最好由应用程序定义特定的查询,并将其编码为存储过程和/或仅使用WHERE条件参数的固定查询
  • 无论如何,SQL函数不是所有这些的合适位置。您应该将SQL表函数视为类似于视图,但带有WHERE子句的参数。你不应该把它当作一种神奇的方式来做任何事情
  • 我要做的事情如下: A.从Oracle数据库中定义应用程序需要的显式查询/数据集。 B.将这些查询作为存储过程写在Oracle数据库上。 C.在SQL Server数据库中设置链接到Oracle数据库的服务器定义。适当地为每一方配置安全性。 D.在SQL Server上编写特定的存储过程,以调用Oracle数据库中的相应过程。使用remote EXEC通过链接服务器定义执行此操作


    远程执行是通过
    AT
    完成的。出于许多原因,不建议使用这些方法,但这里最大的一个原因是,如中所示,您不能从用户定义的函数中使用动态SQL:

    在你开始之前 限制和限制
    • 用户定义的函数不能使用动态SQL或临时表。允许使用表变量


    以下是这种方法的一些其他问题:

  • 您的动态SQL是可注入的。除非您了解什么是SQL注入,否则永远不要使用动态SQL
  • 使用动态sql有潜在的安全性和限制。在这种情况下,动态SQL可能没有与您的帐户相同的权限,并且可能无法使用OPENQUERY
  • 数据库和服务器可信设置的性质可能会阻止此操作
  • 恕我直言,不建议使用OPENQUERY(有些人不同意),使用链接服务器和remote EXEC命令可以更好地处理远程查询
  • 您正在尝试在此处编写“通用查询”。通用查询通常不是一个好主意,并且存在安全问题,即使在修复SQL注入问题之后也是如此。最好由应用程序定义特定的查询,并将其编码为存储过程和/或仅使用WHERE条件参数的固定查询
  • 无论如何,SQL函数不是所有这些的合适位置。您应该将SQL表函数视为类似于视图,但带有WHERE子句的参数。你不应该把它当作一种神奇的方式来做任何事情
  • 我要做的事情如下: A.从Oracle数据库中定义应用程序需要的显式查询/数据集。 B.将这些查询作为存储过程写在Oracle数据库上。 C.在SQL Server数据库中设置链接到Oracle数据库的服务器定义。适当地为每一方配置安全性。 D.在SQL Server上编写特定的存储过程,以调用Oracle数据库中的相应过程。使用remote EXEC通过链接服务器定义执行此操作


    远程执行是通过
    AT

    完成的,每当您使用动态SQL时,您几乎总是遇到麻烦。您是否考虑过不需要动态SQL的解决方案?请参阅。调试是程序员工作的一部分。在执行之前,您是否尝试打印每个变量以查看其外观
    PRINT@TSQL
    PRINT@OPENQUERY+@TSQL
    此外,您不能从函数调用存储过程。每当您使用动态SQL时,您几乎总是遇到麻烦。您是否考虑过不需要动态SQL的解决方案?请参阅。调试是程序员工作的一部分。在执行之前,您是否尝试打印每个变量以查看其外观
    PRINT@TSQL
    PRINT@OPENQUERY+@TSQL
    此外,您不能从函数调用存储过程。