这可能是一个有点奇怪的问题,但是我如何能够在存储过程中确定链接服务器是 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/