【问题标题】:SELECT case using a variable which can be set based on a parameter使用可以基于参数设置的变量的 SELECT 案例
【发布时间】:2015-05-05 22:54:22
【问题描述】:

我想从一个表中选择一个特定的值,同时使用另一个数据库中的信息,该信息是基于当前数据库的值设置的。

所以选择案例来查找操作员代码并设置数据库路径..然后使用相同的路径并整理结果。

DECLARE @DB varchar (1000)

CASE 
WHEN @Operator= 1 THEN SET @DB = '{SERVERNAME\ENTITY\DBNAME}'
WHEN @Operator= 2 THEN SET @DB = '{SERVERNAME2\ENTITY2\DBNAME2}'
WHEN @Operator= 3 THEN SET @DB = '{SERVERNAME3\ENTITY3\DBNAME3}'

Select transItem_item collate SQL_Latin1General_CI_AS
FROM Group_Transactions
INNER JOIN @DB.Table_Trans
ON (transItem.item_id collate SQL_Latin1General_CI-AS = Table_Trans.item_id)
Where ---Condition

【问题讨论】:

  • 哪个 dbms? (这看起来不像 ANSI SQL...)

标签: sql sql-server


【解决方案1】:

控制流方法(可能是最有效的):

IF @Operator = 1
  BEGIN
    SELECT stuff
    FROM   Group_Transactions
     INNER
      JOIN "Server1\Instance1".Database1.Schema.Table_Trans
        ON Group_Transactions... = Table_Trans...
    WHERE  things...
    ;
  END
ELSE IF @Operator = 2
  BEGIN
    SELECT stuff
    FROM   Group_Transactions
     INNER
      JOIN "Server2\Instance2".Database2.Schema.Table_Trans
        ON Group_Transactions... = Table_Trans...
    WHERE  things...
    ;
  END
ELSE IF @Operator = 3
  BEGIN
    SELECT stuff
    FROM   Group_Transactions
     INNER
      JOIN "Server3\Instance3".Database3.Schema.Table_Trans
        ON Group_Transactions... = Table_Trans...
    WHERE  things...
    ;
  END
;

单[条件]查询方式:

SELECT Group_Transactions.stuff
     , trans1.other_thing As other_thing1
     , trans2.other_thing As other_thing2
     , trans3.other_thing As other_thing3
     , Coalesce(trans1.other_thing, trans2.other_thing, trans3.other_thing) As other_thing
FROM   Group_Transactions
 LEFT
  JOIN "Server1\Instance1".Database1.Schema.Table_Trans As trans1
    ON trans1... = Group_Transactions...
   AND trans1.things...
   AND @Operator = 1
 LEFT
  JOIN "Server2\Instance2".Database2.Schema.Table_Trans As trans2
    ON trans2... = Group_Transactions...
   AND trans2.things...
   AND @Operator = 2
 LEFT
  JOIN "Server3\Instance3".Database3.Schema.Table_Trans As trans3
    ON trans3... = Group_Transactions...
   AND trans3.things...
   AND @Operator = 3
;

【讨论】:

    【解决方案2】:

    如果这是 TSQL(我从您的排序规则名称中猜测),那么您最好尝试使用 OPENQUERY 来针对另一台数据库服务器运行您的联接。如果您在同一台服务器上查询数据库,您可以将查询构建为参数,然后使用EXEC 运行它。

    【讨论】:

    • 不幸的是,我正在处理多个服务器上的多个 DBS。
    • 我也不确定 collat​​e 函数的工作原理。我是将第一个 DB 与第二个 DB 的排序规则进行比较还是反之亦然?)
    • 这取决于你想做什么。通常,您会从较大的代码路径整理到较小的代码路径。
    • 您也可以使用链接服务器。易于设置并允许跨 SQL Server 查询。使用链接服务器 Stephan 的解决方案会很方便地保持简短。
    【解决方案3】:

    Gvee 的控制流方法可能很冗长,但它会起作用。如果你有一堆数据库,你可能想创建一个像我的 @tbl_Databases 一样的查找表。这是一个动态 SQL 解决方案:

    DECLARE @Operator INT = 1,
            @DB VARCHAR(1000);
    
    DECLARE @tbl_Databases TABLE (ID INT IDENTITY(1,1),DB VARCHAR(1000))
    INSERT INTO @tbl_Databases(DB)
    VALUES ('{SERVERNAME\ENTITY\DBNAME}'),('{SERVERNAME2\ENTITY2\DBNAME2}'),('{SERVERNAME3\ENTITY3\DBNAME3}');
    
    SELECT @DB = DB
    FROM @tbl_Databases
    WHERE ID = @Operator
    
    SELECT @DB
    
    SELECT
    (
    'SELECT transItem_item COLLATE SQL_Latin1General_CI_AS
    FROM Group_Transactions
    INNER JOIN ' + @DB + '.dbo.Table_Trans
    ON (transItem.item_id collate SQL_Latin1General_CI-AS = Table_Trans.item_id)
    Where 1 = 1'
    )
    

    【讨论】:

    • 与链接服务器一起使用的好解决方案
    • 这也很好。查找表。没想到。谢谢!
    猜你喜欢
    • 2012-07-12
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多