如何动态决定在SQL Server存储过程中加入哪些表

时间:2012-01-06 20:54:18

标签: sql sql-server sql-server-2008 tsql stored-procedures

我有一张表tbl_Info

InfoId
Text
PrivacyTypeId
UserName
TypeId
IsInfo
InfoItemId

数据示例:

1|Some text...|1|userX|1|False|NULL
2|New job created|1|system|3|True|765
3|Image commented|1|system|4|True|457

在我的应用程序中,我从此表中获取所有值,并将其显示为列表。

应用程序用户可以单击每个项目,并且应该将它们重定向到应用程序中的某个位置。

我在数据库中有几个绑定到此表的表,但此连接非常动态。例如,这个表:

tbl_Jobs{JobId, Title etc.}, tbl_Articles{ArticleId, Title etc.}

问题在于:
在我添加IsInfoInfoItemId之前,我只有一种用户输入此信息的类型,我只需要获取信息列+用户全名:

select i.*, p.FirstName + ' ' + p.LastName as Author 
from tbl_Info i 
left join tbl_Profiles p on i.UserName = p.UserName
where i.PrivacyTypeId = 1

现在我需要更改名为Author的{​​{1}}列,此值应为:全名或职位或文章标题等。

我不知道是否可以制作选择程序,因此它可以基于TitleIsInfo从ID为TypeId的另一个表中获取项目标题。

如下所示:如果IsInfo = True。获取typeId。并基于此typeId连接到某个表并从中获取一些列。

InfoItemId
对不起,我很抱歉。但我无法找到解决方案,我需要更详细地解释一下问题。

3 个答案:

答案 0 :(得分:11)

你可以这样做:

SELECT
 CASE typeID
   WHEN 1 THEN tbl_Profiles.FirstName + ' ' + tbl_Profiles.LastName
   WHEN 2 THEN ...
   WHEN 3 THEN ...
 END AS Title
FROM tbl_Info 
LEFT OUTER JOIN tbl_Profiles ON 
   tbl_Info.UserName = tbl_Profiles.UserName
   AND typeID = 1
LEFT OUTER JOIN tbl_Jobs ON
   ....
   AND typeID = 2
LEFT OUTER JOIN tbl_Articles ON
   ....
   AND typeID = 3

答案 1 :(得分:2)

我可能错过了一些东西,但是在第一次检查时,您可以通过使用简单的IF语句来解决在给定存储过程中需要两个代码路径的问题。

IF (ConditionIsTrue)
BEGIN
      -- First form of select statement
END
ELSE
BEGIN
     -- Second form of select statement
END

答案 2 :(得分:2)

如果您需要在一个大列表中显示数据,可以使用联合将它们绑定在一起:

SELECT i.*, p.FirstName + ' ' + p.LastName as Author 
  FROM tbl_Info i
    INNER JOIN tbl_Profiles p ON i.UserName = p.UserName
    WHERE i.PrivacyTypeID=1
UNION ALL
SELECT i.*, j.Title
  FROM tbl_Info i
     INNER JOIN tbl_Jobs j ON ...
     WHERE i.PrivacyTypeID=2
...

否则,如果你真的只是希望一次显示不同的东西(即只是简介,只是工作等),那么请使用John Sansom的答案,用IF语句包装它