我如何有条件地使用链接服务器,具体取决于当前运行存储过程的环境?

时间:2011-03-17 17:12:04

标签: sql-server-2005 stored-procedures linked-server

这是我遇到的问题。我正在尝试创建一个将部署到DEV,QA和PROD环境的存储过程。由于对部署过程的严格要求,我必须在所有三种环境中确保我的处理顺序并且必须工作(当然!)。问题是此proc引用了不同数据库中的表。在DEV和QA中这是可以的,因为数据库在同一服务器上,但是在PROD中,所讨论的数据库位于单独的服务器上。以下是我的proc中的代码片段,它试图处理不同的环境问题:

IF @@SERVERNAME<>'Production'
BEGIN
  select distinct m.acct_id 
  from l_map m (nolock)
  join #llist ll on ll.acct_id = m.acct_id
  where ll.acct_id not in (select l_number from [OTHERDATABASE].[dbo].[OTHERTABLE] where lmi_status_code not in (select item from #ruleItems))
END 
ELSE
BEGIN
  select distinct m.acct_id 
  from l_map m (nolock)
  join #llist ll on ll.acct_id = m.acct_id
  where ll.acct_id not in (select l_number from [OTHERSERVER].[OTHERDATABASE].[dbo].[OTHERTABLE] where lmi_status_code not in (select item from #ruleItems))
END

我的proc是从一个不同的proc中调用的。当我直接测试上述逻辑时,我得到了我期望的结果。但是,当我尝试在DEV或QA(从顶级proc)的上下文中测试它时,我收到一条错误,指出找不到[OTHERSERVER]。我不能(也不需要)在DEV和QA中创建链接服务器,但我需要能够在PROD环境中使用链接服务器。有谁知道如何做到这一点?

3 个答案:

答案 0 :(得分:0)

我的建议是在链接服务器的表上创建一个视图。在测试服务器上,您可以使用测试数据在本地表上创建视图。

通过这种方式,有关链接服务器的信息将被隔离到视图中。然后,您可以编写引用该视图的存储过程或其他查询,而不是直接引用链接服务器。

请注意,这不会使您测试所需的安全性和权限,只会使查询与架构一起使用。

答案 1 :(得分:0)

使用同义词see here

另请参阅以下两个SO示例:onetwo

每台服务器上的同义词定义可能不同,但代码(存储过程)不会改变。

答案 2 :(得分:0)

I have the same situation. Using an alias, I can not use OpenQuery that I need to execute functions with parameters on the destination server, where a simple SELECT INTO or EXECUTE was not possible.

Using EXEC will return (using my configuration) in error Msg 7411:

Server 'linked_server_name' is not configured for RPC.

Here is an example of my approach using a string query. Note that on testing I don't use linked server but you can use one if you need:

-- Prepare Source Query Fragment
IF @@SERVERNAME = 'production_server'
    SET @SelectQuery = ' OPENQUERY ([' 
        + @SourceServer + '],''EXEC [production_source_db].[schema_name].['
        + @FuncrionName+'] ''''' 
        + @param_1 + ''''',    ''''' 
        + @param_2 + ''''''')';
ELSE
    SET @SelectQuery = ' EXEC [testing_schema].['
        + @FuncrionName+'] ''' 
        + @param_1 + ''',    ''' 
        + @param_2 + ''')';

-- Prepare Destination Query Fragment
IF @@SERVERNAME = 'production_server'
    SET @Destination = '[production_destination_server].[production_destination_db].[schema_name]'; 
ELSE
    SET @Destination = '[testing_schema]';

-- Execute the data transfer
EXEC ('
INSERT INTO ' + @Destination + '.[Destination_Table] (
      [Col1]
    , [Col2])
SELECT
      [Col1]
    , [Col2]
FROM ' + @SelectQuery )