有没有一种方法可以从SQL主查询的内容中动态选择子查询中的表?

时间:2020-10-07 09:26:50

标签: sql sql-server stored-procedures

我的表格有点像以下内容:

GroupText(itemId int,tableName nvarchar,文本nvarchar) 1,“ ItemTable1”,“某些文本” 2,“ ItemTable2”,“某些文本” 3,“ ItemTable2”,“某些文本” 4,“ ItemTable3”,“某些文本”

ItemTable1(itemId int,isProposal) 1、1

ItemTable2(itemId int,isProposal) 2,0 3,1

ItemTable3(itemId int,isProposal) 4,0

我正在尝试从GroupText中选择文本列的方法,其中isProposal在属于该文本的ItemTable中为1

我也许可以做这样的事情:

SELECT text
FROM GroupText gt
WHERE
(
 ( 
  gt.tableName = 'ItemTable1' AND
  (
    SELECT COUNT(itemId)
    FROM ItemTable1 tbl1
    WHERE tbl1.itemId = gt.itemId AND tbl1.isProposal = 1
  ) > 0
 ) OR 
 ( 
  gt.tableName = 'ItemTable2' AND
  (
    SELECT COUNT(itemId)
    FROM ItemTable2 tbl2
    WHERE tbl2.itemId = gt.itemId AND tbl2.isProposal = 1
  ) > 0
 ) OR 
...
)

但这不可行,因为有30多个表

我认为我有一个很好的主意,即将子查询放入一个函数中,其中tableName和itemId是参数

DECLARE @sql nvarchar(max)
SET @sql = N'SELECT isProposal FROM ' + @tableName + ' WHERE itemId = @itemId';
EXEC sp_executesql @sql,

然后使用如下代码获取值:

SELECT text
FROM GroupText gt
WHERE
 functionName(gt.itemId, gt.tableName) = 1

但是不允许函数像这样执行sql

据我所知,视图也不是一种选择,因为它们无法像这样动态地构建sql

我现在唯一看到的选择是将其分为两部分。首先将所有数据从GroupText加载到临时表中,然后为每个项目调用一个更动态的sql(例如我在函数中尝试过的sql),看看是否应在结果中包含它

这是完成我正在尝试的最好方法还是有更好的方法?

0 个答案:

没有答案