【问题标题】:Select a variable table name选择一个变量表名
【发布时间】:2018-10-22 15:39:19
【问题描述】:

我正在尝试为 Microsoft Dynamics Nav 数据库的查询编写一些 SQL 语句。我正在尝试编写可以在不同的导航数据库中轻松使用的脚本。每个数据库的表名都是唯一的,因为它们总是在表名中包含客户姓名,后跟 $tablename。因此,例如,如果公司的名称是 ABC Company,那么表格 Rating 将是 ABC 公司$Rating 并在 XYZ 公司的另一个数据库中 XYZ 公司_$评级。 有什么建议吗?

【问题讨论】:

  • 您的问题是登机,请尝试改写它,这样它就会成为一个特殊的问题。此外,如果可能的话,展示您在尝试找到解决方案时所做的一些努力会很有帮助,甚至可以附上您的一些源代码,向我们展示您遇到的问题。

标签: sql tablename


【解决方案1】:

我找到了一种使用动态 SQL 的方法(尽管它确实很笨拙)。这样做的缺点是编写一个简单的 select 语句需要大量代码,并且不会像普通脚本那样检查脚本的上下文是否存在错误:

声明@Company 表 ( id INT 身份, 名称 NVARCHAR(30) )

INSERT INTO @Company (Name)
SELECT Name FROM Company

declare @Script varchar(max) = 'select * from [[$Company$]$Customer]'
DECLARE @script2 VARCHAR(MAX)

DECLARE @CompanyCount int = (SELECT COUNT(Name) FROM @Company)
DECLARE @Row INT = 0

DECLARE @CompanyName NVARCHAR(30)

WHILE @Row <= @CompanyCount
BEGIN
SET @Row = @Row + 1
SET @companyName = (SELECT TOP 1 Name FROM @Company WHERE id = @Row)
SET @CompanyName = REPLACE(@CompanyName, '.', '_')
SET @script2 = REPLACE(@script, '[$Company$]', @CompanyName)    
EXEC (@script2)
end 

【讨论】:

    【解决方案2】:

    我不清楚为什么表名不同,因为每个客户表似乎位于不同的数据库中。如果您可以避免为每个客户以不同的方式命名表格,我会建议您这样做。

    但是,如果您必须提供这些以客户为中心的表名,也许您还可以使用“基本”表名为每个表创建一组视图,例如

    create view Rating as select * from ACME$Rating;
    

    然后使用这些视图编写所有脚本。

    【讨论】:

    • 我的猜测是,它是当时最初的程序员设计的方式,微软从来没有费心去改变它,所以它今天保持不变。
    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多