我正在尝试为Microsoft Dynamics Nav数据库的查询编写一些SQL语句。我正在尝试编写可以在不同Nav数据库中轻松使用的脚本。每个数据库的表名都是唯一的,因为它们在表名中始终带有客户名,后跟 $ tablename。因此,例如,如果公司名称为ABC Company,则表Rating为 ABC Company $ Rating,然后在XYZ Company的另一个数据库中 XYZ Company_ $评级。 有什么建议吗?
答案 0 :(得分:0)
我发现了一种使用动态SQL的方法(尽管确实很笨拙)。不利之处在于,编写简单的select语句需要花费大量代码,并且不像正常脚本那样检查脚本上下文中的错误:
声明@Company表 ( id INT IDENTITY, 名称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
答案 1 :(得分:0)
我不清楚为什么表名不同,因为每个客户表似乎都在不同的数据库中。如果您可以避免为每个客户分别命名不同的表,则建议您这样做。
但是,如果您必须提供这些以客户为中心的表名称,也许您还可以为每个具有“基本”表名称的表创建一组视图,例如
create view Rating as select * from ACME$Rating;
然后使用这些视图编写所有脚本。