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 测试实例,测试将不会完全有效。