Sql server 使用变量和OpenQuery的基于表的函数
我正在尝试通过SQL server从Oracle服务器查询数据。为了以瘦客户机的方式执行此操作,我使用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
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
此外,您不能从函数调用存储过程。