【问题标题】:How do I use a Dynamic table name?如何使用动态表名?
【发布时间】:2021-03-07 15:44:45
【问题描述】:

我有一个数据库,其中每个公司都有自己的表,并且所有公司的表名都相同,例如:

[COMPANY 1$Cities], [COMPANY 1$Customers], [COMPANY 1$Documents]  
[COMPANY 2$Cities], [COMPANY 2$Customers], [COMPANY 2$Documents]   
[COMPANY 3$Cities], [COMPANY 3$Customers], [COMPANY 3$Documents]

当我从特定公司选择一个值时,我有一个可以正常工作的存储过程。

但是,问题是我必须为我们在数据库中拥有的每个公司创建这个存储过程,而且数量很多(而且我认为这不是最好的决定,基于数据库性能)

最后,我想知道是否可以使用 TABLE NAME 中的参数从特定公司中选择值。

类似SELECT +@CityName+ FROM [dbo].[@CompanyName+$Cities]

【问题讨论】:

  • 您可以为单独的公司表创建单独的模式。但是,如果您共享存储过程的脚本和示例数据来模拟,可以更好地解释您的问题
  • 修复你的数据模型!这就是开始的地方。
  • 如果你不能修复它,总是有动态 SQL,这是一个复杂的主题,我建议你谷歌并做一些阅读。
  • 我无法更改数据模型上的任何内容,它是我们使用的 ERP 的标准配置:(

标签: sql sql-server database dynamic


【解决方案1】:

您不需要为此任务编写动态 SQL。创建一个database VIEW,在其中合并所有公司的表并添加不变的公司代码。然后,您可以根据该公司代码过滤您的数据,并使用通用 SQL 获取您需要的内容。

但无论如何,这样的数据库设计非常奇怪且难以管理。您可以使用分区表并应用数据安全来限制公司上的数据。

【讨论】:

    【解决方案2】:

    @Kelson,我不确定您在什么情况下运行它。如果您在 SQLCMD 上下文中可以将表名存储在变量中。

    要将上下文更改为 SQLCMD,请转到 SSMS 菜单并单击 Query -> SQLCMD Mode

    这是它的图像:

    更改后,您可以运行如下内容:

    :setvar TableCompanyCity1 "TableName1"
    :setvar TableCompanyCity2 "TableName2"
    
    select * from dbo.$(TableCompanyCity1)
    select * from dbo.$(TableCompanyCity2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-11
      • 1970-01-01
      • 2016-05-24
      • 2022-06-13
      • 1970-01-01
      相关资源
      最近更新 更多