SQL Server:如何从选择值使用变量tablename

时间:2016-12-08 10:14:30

标签: sql-server

 SELECT
 (
     SELECT SUM(ISNULL(Volume,0))
       FROM Order_【a1.Login】
      WHERE Login = a1.Login
 ) AS SelfVolume
 FROM dbo.Account a1

我希望子选择(【a1.Login】)中的表名与外部select语句(表a1.Login的字段Login)中的值Account匹配。我怎样才能得到这个结果?     

1 个答案:

答案 0 :(得分:11)

技术答案是:使用动态SQL。它很复杂,容易出错且有潜在危险(谨防Bobby Tables)。您的SQL将变得不可读且无法维护。你正在进入痛苦的世界。

正确答案是:你没有。不要为每个用户创建单独的Orders表。使用您的帐户表的外键创建一个订单表。

如果你仍然希望继续使用这个破碎的数据库设计(请记住:你正在进入一个痛苦的世界,而你刚刚开始),你将需要以某种方式动态构建以下SQL:

 SELECT SUM(ISNULL(Login_Volume,0)) FROM
 (
     SELECT SUM(ISNULL(Volume,0)) AS Login_Volume FROM Order_SomeUser WHERE Login = 'SomeUser'
     UNION ALL
     SELECT SUM(ISNULL(Volume,0)) AS Login_Volume FROM Order_SomeOtherUser WHERE Login = 'SomeOtherUser'
     UNION ALL
     ...
 ) AS AllSums

您可以使用目标语言(C#,Java,PHP等)以您选择的语言执行此操作,这可能是最简单且最易维护的解决方案,或者直接在T-SQL中使用T -SQL游标和循环(=艰难的方式)。无论您选择哪种语言,算法都是直截了当的:

  • 遍历您的Account表格并获取Login
    • Sanitize the value并验证相应的Order_表是否存在。
    • 为每个帐户创建一个SQL语句。
    • 加入UNION ALL
  • 如上图所示,将它们包裹在外部SELECT中。

再说一次:如果有任何机会修复破坏的数据库设计,那么,从长远来看付出

相关问题