SQL: 如何为某些服务器实例有条件地定义包含链接服务器ID的代码?
SQL: How to conditionally define the code that contains linked server ID only for some server instances?
我正在 SQL 服务器上编写一个数据泵作为存储过程。预计从 Sybase 中提取一些数据,并在 SQL 服务器数据库中更新或插入 table。
对于开发,源 table 存储在与目标 table 相同的 SQL 服务器上的测试数据库中(在不同的数据库中)。在生产站点上,Sybase 服务器作为链接服务器连接。
如何编写既适用于测试站点又适用于生产站点的通用代码(用于安装脚本)?
查看片段...和下面的详细信息:
CREATE PROCEDURE dbo.sp_data_pump
AS
BEGIN
SET NOCOUNT ON
IF @@servername = 'COMPUTER\SQLTESTINSTANCE' BEGIN
-- for development
MERGE dbo.sometable AS tar
USING (SELECT code, data
FROM dbtest.dbo.datapump_sometable) AS source -- !!!!
ON tar.code = source.code
WHEN MATCHED THEN
UPDATE
SET tar.data = source.data,
tar.changed = GETDATE(),
tar.changedby = 'datapump'
WHEN NOT MATCHED THEN
INSERT (data, created, createdby)
VALUES (source.code, source.data, GETDATE(), 'datapump');
END ELSE BEGIN
-- for the deployed application
MERGE dbo.sometable AS tar
USING (SELECT data
FROM OPENQUERY(LINKEDSRVID, 'SELECT * FROM xdb.schema.xxx_sometable')) AS source -- !!!!
ON tar.code = source.code
WHEN MATCHED THEN
WHEN MATCHED THEN
UPDATE
SET tar.data = source.data,
tar.changed = GETDATE(),
tar.changedby = 'datapump'
WHEN NOT MATCHED THEN
INSERT (data, created, createdby)
VALUES (source.code, source.data, GETDATE(), 'datapump');
END
END
Sybase数据库包含访问数据的视图;但是,只能通过 OPENQUERY(LINKEDSRVID, 'SELECT ....')
调用视图。因此,LINKEDSRVID
必须存在。但是,它不是在开发站点上创建的,因此代码无法编译。
问题的核心可以简化为伪代码:
CREATE PROCEDURE dbo.sp_data_pump
AS
BEGIN
IF @@servername = 'COMPUTER\SQLTESTINSTANCE' BEGIN
-- for development
...
SELECT * FROM dbtest.dbo.datapump_sometable) AS source
...
END ELSE BEGIN
-- for the deployed application
...
SELECT * FROM OPENQUERY(LINKEDSRVID, 'SELECT * FROM xdb.schema.xxx_sometable')) AS source
...
END
END
问题应该如何解决?
听起来你只需要在你的开发环境中创建一个假的 linked 服务器来模拟现场...你可以通过使用 linked 服务器连接来实现=22=] 本机驱动程序可以有任何名称,但将源设置为本地主机。 link 仅供其自身使用,无功能,仅用于开发。
例如;
EXEC master.dbo.sp_addlinkedserver
@server = N'LiveServerName',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'localhost' --just to imitate the connection
为了验证第 4 部分 "remote" 参考,也在本地主机上创建数据库和其他 tables/objects。
希望这是有道理的。
虽然您可以将代码包装在动态 SQL 中以避免编译错误,但我建议您在 dev 中创建一个名为 LINKEDSRVID
的链接服务器,并且只在 proc 中包含 OPENQUERY
.理想情况下,它应该指向一个测试 Sybase 实例,但如果这不是一个选项,您可以为 dbtest 数据库创建一个实例。请注意,如果您没有 Sybase 测试实例,测试将不会完全有效。
我正在 SQL 服务器上编写一个数据泵作为存储过程。预计从 Sybase 中提取一些数据,并在 SQL 服务器数据库中更新或插入 table。
对于开发,源 table 存储在与目标 table 相同的 SQL 服务器上的测试数据库中(在不同的数据库中)。在生产站点上,Sybase 服务器作为链接服务器连接。
如何编写既适用于测试站点又适用于生产站点的通用代码(用于安装脚本)?
查看片段...和下面的详细信息:
CREATE PROCEDURE dbo.sp_data_pump
AS
BEGIN
SET NOCOUNT ON
IF @@servername = 'COMPUTER\SQLTESTINSTANCE' BEGIN
-- for development
MERGE dbo.sometable AS tar
USING (SELECT code, data
FROM dbtest.dbo.datapump_sometable) AS source -- !!!!
ON tar.code = source.code
WHEN MATCHED THEN
UPDATE
SET tar.data = source.data,
tar.changed = GETDATE(),
tar.changedby = 'datapump'
WHEN NOT MATCHED THEN
INSERT (data, created, createdby)
VALUES (source.code, source.data, GETDATE(), 'datapump');
END ELSE BEGIN
-- for the deployed application
MERGE dbo.sometable AS tar
USING (SELECT data
FROM OPENQUERY(LINKEDSRVID, 'SELECT * FROM xdb.schema.xxx_sometable')) AS source -- !!!!
ON tar.code = source.code
WHEN MATCHED THEN
WHEN MATCHED THEN
UPDATE
SET tar.data = source.data,
tar.changed = GETDATE(),
tar.changedby = 'datapump'
WHEN NOT MATCHED THEN
INSERT (data, created, createdby)
VALUES (source.code, source.data, GETDATE(), 'datapump');
END
END
Sybase数据库包含访问数据的视图;但是,只能通过 OPENQUERY(LINKEDSRVID, 'SELECT ....')
调用视图。因此,LINKEDSRVID
必须存在。但是,它不是在开发站点上创建的,因此代码无法编译。
问题的核心可以简化为伪代码:
CREATE PROCEDURE dbo.sp_data_pump
AS
BEGIN
IF @@servername = 'COMPUTER\SQLTESTINSTANCE' BEGIN
-- for development
...
SELECT * FROM dbtest.dbo.datapump_sometable) AS source
...
END ELSE BEGIN
-- for the deployed application
...
SELECT * FROM OPENQUERY(LINKEDSRVID, 'SELECT * FROM xdb.schema.xxx_sometable')) AS source
...
END
END
问题应该如何解决?
听起来你只需要在你的开发环境中创建一个假的 linked 服务器来模拟现场...你可以通过使用 linked 服务器连接来实现=22=] 本机驱动程序可以有任何名称,但将源设置为本地主机。 link 仅供其自身使用,无功能,仅用于开发。
例如;
EXEC master.dbo.sp_addlinkedserver
@server = N'LiveServerName',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'localhost' --just to imitate the connection
为了验证第 4 部分 "remote" 参考,也在本地主机上创建数据库和其他 tables/objects。
希望这是有道理的。
虽然您可以将代码包装在动态 SQL 中以避免编译错误,但我建议您在 dev 中创建一个名为 LINKEDSRVID
的链接服务器,并且只在 proc 中包含 OPENQUERY
.理想情况下,它应该指向一个测试 Sybase 实例,但如果这不是一个选项,您可以为 dbtest 数据库创建一个实例。请注意,如果您没有 Sybase 测试实例,测试将不会完全有效。