我正在尝试编写一个存储过程,并根据特定的列值,我希望能够更改我从中选择的表。我会尝试举一个例子:

SELECT ItemNumber,
       ItemType, 
       Description
FROM

CASE ItemType
WHEN 'A' THEN TableA
ELSE TableB
END

WHERE 

CASE ItemType
WHEN 'A' THEN ItemNumber = @itemNumber
ELSE PartNumber = @itemNumber
END

如您所见,我不仅动态地更改了我从中选择的表,而且由于这两个表是由两个不同的人在两个不同的时间制作的,因此列的名称也不同。

因此,我的问题是:完成此操作的最佳方法是什么,因为SQL Server似乎不喜欢我构建的查询。

如果有人看到我想做的事情可以提出一种更好的方法来做到这一点,我将全力以赴:-)

有帮助吗?

解决方案

您无法从子句中使用案例语句,但是可以使用以下内容:

SELECT itemnumber, itemtype, description
  FROM tablea
 WHERE itemnumber = @itemnumber AND itemtype = 'A'
UNION ALL
SELECT itemnumber, itemtype, description
  FROM tableb
 WHERE partnumber = @itemnumber AND itemtype <> 'A'

其他提示

您可以尝试将动态SQL语句构建为字符串,然后调用SP_EXECUTESQL存储过程以执行字符串。

这里 有关更多信息和示例。

我不确定您为什么要在一个SQL语句中做事。.我不是SQL Server的人,但是在Oracle存储的过程中,您可以写下类似的内容

If itemtype = 'A' 
Then 
 <statement for table A>
Else
 <statement for Table B>
End if

这样的事情也应该在SQL Server中起作用。也许有人可以扩展这一点?

您真的没有解释在哪里 ItemType 来自。如建议 UNION 如果您只是简单地组合两个表,则可能适用。

这是可能与您的问题有关的另一种可能性:

SELECT ItemNumber,
       ItemType, 
       COALESCE(TableA.Description, TableB.Description) AS Description
FROM Items
LEFT JOIN TableA
    ON Items.ItemType = 'A'
    AND TableA.ItemNumber = Items.ItemNumber
LEFT JOIN TableB
    ON Items.ItemType <> 'A'
    AND TableB.ItemNumber = Items.ItemNumber

您最好先使用Union查询来首先加入表格,然后选择。

另外,您可以考虑为其中一张表创建视图,因此它仅在重命名它们时才拉出所需的列,然后从联合中选择。

或使用临时表存储每个查询的结果。将临时表的创建放在情况下(伪代码,未测试):

CASE @itemType
   WHEN 'A'
      SELECT ACol1 AS Col1, ACol2 AS Col2
      FROM TABLE_A
      INTO #tempTable
      WHERE ItemNumber = @itemNumber
   ELSE
      SELECT BCol1 AS Col1, BCol2 AS Col2
      FROM TABLE_B
      INTO #tempTable
      WHERE PartNumber = @itemNumber
END

SELECT * FROM #tempTable
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top