sql - 如何创建动态查询以连接 SQL Server 中的不同服务器数据库?
问题描述
我想创建动态查询来访问不同的数据库服务器。
例如,我尝试过的是
CREATE PROC spDifferentServer
@Server1 int,
@Server2 int
AS
BEGIN
Declare @Server1IP varchar[MAX] = ''
SELECT CASE WHEN @Server1 = '777' THEN SET @Server1IP = '[192.168.164.8].[Employee].[dbo].' ELSE '' END
Declare @Server2IP varchar[MAX] = ''
SELECT CASE WHEN @Server2 = '888' THEN SET @Server1IP = '[192.168.131.8].[Employee].[dbo].' ELSE '' END
SELECT
d1.Name
FROM
@Server1IP +''+[Details] d1
WHERE
Not Exists (
SELECT 1
FROM @Server2IP +''+[Details] d2
WHERE d2.ID = d1.ID
)
END
但它不起作用...
解决方案
您不能提供变量来替换对象的名称。例如,以下内容将不起作用:
DECLARE @o nvarchar(255) = N'sys.objects';
SELECT *
FROM @o;
您需要创建动态 SQL 并执行它。例如:
DECLARE @s sysname N'dbo', @t sysname = N'objects';
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT * FROM ' + QUOTENAME(@s) + N'.' + QUOTENAME(@o) + N';';
EXEC sp_executesql @SQL;
对于你所拥有的,这将导致这样的事情(这是未经测试的):
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT d1.[Name]' + NCHAR(10) +
N'FROM ' + @Server1IP + N'[Details] d1' + NCHAR(10) +
N'WHERE NOT EXISTS (SELECT 1' + NCHAR(10) +
N' FROM ' + @Server2IP + N'[Details] d2' + NCHAR(10) +
N' WHERE d1.ID = d2.ID);';
PRINT @SQL; --Your best friend
EXEC sp_executeSQL @SQL;
如果语法不完全正确,您最好的朋友会帮助您调试它。
推荐阅读
- java - org.openqa.selenium.SessionNotCreatedException:无法通过 Selenium 和 Java 使用 GeckoDriver 和 Firefox 创建会话错误
- mongodb - mac:找不到命令:mongod
- python - Keras 迁移学习
- android - Android Studio布局按子文件夹排序不起作用
- angular - 升级后相同安装的 Angular Material 版本不同
- kotlin - JOOQ:通过记录更新时如何添加返回子句
- sql - 如何优化 sql where = (select from same_table)
- pandas - 如何提取具有多于几列的值的数据帧的行
- php - 在 SMS 中,是否有一个链接可以打开带有特定号码的拨号盘?怎么做?
- scala - varargs 选项的 scala 惰性 zip 到元组选项