sql-server - 以编程方式确定链接服务器是 Oracle 还是 SQL Server

标签 sql-server oracle

这可能是一个有点奇怪的问题,但是我如何能够在存储过程中确定链接服务器是 Oracle 还是 SQL Server?

为了提供一些上下文,我们有一个应用程序在生产中查询包含 PID(个人身份信息)的链接服务器(Oracle 服务器,不是我们的服务器),因此我们不允许在我们的开发中使用它,测试环境。遗憾的是,我们无法设置自己的 Oracle 服务器,因此在测试环境中,我们设置了一个 SQL Server 实例作为链接服务器,其中包含模拟数据。

对于我们 99% 的查询,除了包含此行的查询外,这不会导致任何问题

WHERE LAST_MODIFIED > TO_DATE(''''' + CONVERT(nvarchar(24), @maxImageDate, 120) + ''''',''''YYYY-MM-DD HH24:MI:SS'''')

我们通常在开发和测试环境中手动修改为

WHERE LAST_MODIFIED > ''''' + CONVERT(nvarchar(24), @maxImageDate, 120) + '''''

我的第一个想法是尝试一个仅适用于 Oracle 的查询:

SELECT 1 FROM OPENQUERY(LinkedServerName, ''SELECT * FROM v$version'')

在 TRY/CATCH 中,如果失败则运行不同的查询,但这会导致即使在捕获错误后事务也无法提交

我们开始使用 octodeploy 进行自动部署,我们可以让 tentacle 代理运行 SQL 脚本来根据环境修改 SP,但更愿意将所有逻辑和代码保留在 SP 内,因此保留在存储库中但如果我们找不到其他解决方案,我们可能会采用该解决方案。

任何帮助将不胜感激

最佳答案

我同意@lad2025,我也会使用 sys.servers (不确定为什么她/他没有发布答案)。

虽然您可以通过现有数据(例如 provider 列)确定哪些服务器是 Oracle,但我会自己设置 product 列以获得最大的灵活性(例如,当业务规则发生变化并且他们设置了 Oracle 服务器并希望从开发人员查询时)。

例如,当使用 sp_addlinkedserver 时,只需将 @srvproduct 设置为“Oracle”或“doNotQueryFromDevOrTest”或您想要使用的任何内容,然后将其放入过程的 if-then 中。

请注意,文档说在链接到 Oracle 时您可以使用此列中的任何内容(最多 128 个字符)。快速测试似乎可以验证这一点,即使对于 SQL Server 也是如此。

我不知道有任何 ANSI-SQL 查询被定义为返回产品名称或 RDBMS 版本。

此外,如果您有其他选择,我不建议使用 try-catch 来实现正常控制流。与 if-then 相比,异常处理通常成本较高。

关于sql-server - 以编程方式确定链接服务器是 Oracle 还是 SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32613246/

相关文章:

database - Oracle数据库导出缺失表

database - 使用带有联合和 CLOB 字段的选择时出现 ORA-00932 错误

sql - 排序、排序、筛选 SQL Server 的复杂组合

sql - 创建这些表: Could not create constraint or index: Datatype mismatch

mysql - 您如何知道在哪个程序中使用哪个 mySQL 代码?

oracle - 征求意见: Accent marks/diacritics in primary key

c# - 通过 IKVM 在 C# 中用于 OIM 的 Java interface.class

java - Docker容器之间的JDBC连接(docker-compose)

sql - 如何使用 t-sql 检查逻辑项组合?

mysql - SQL - 字段列表中的列不明确