【发布时间】:2013-07-26 20:32:43
【问题描述】:
我正在尝试从需要在变量中的表中进行选择。我正在使用从应用程序动态创建的表。该表将命名为 CMDB_CI_XXX,其中 XXX 将是基于另一个表中的值的整数值。最终目标是从表中获取 CI 名称。
我尝试将组成表名的部分传递给函数并将它们串在一起,然后返回名称值,但我不允许在函数中使用 EXEC 语句。
这就是我要执行以获取名称值的内容:
Select [Name] from 'CMDB_CI_' + C.CI_TYPE_ID + Where CI_ID = c.CI_ID
这是我想在其中使用函数来获取名称值的 SP 中的代码:
SELECT
CI_ID,
C.CI_TYPE_ID,
CI_CUSTOM_ID,
STATUS,
CI_TYPE_NAME,
--(Select [Name] from CMDB_CI_ + C.CI_TYPE_ID + Where CI_ID = c.CI_ID)
FROM [footprints].[dbo].[CMDB50_CI_COMMON] c
join [footprints].[dbo].[CMDB50_CI_TYPE] t
on c.CI_TYPE_ID = t.CI_TYPE_ID
where status <> 'retired'
order by CI_TYPE_NAME
我不知道该怎么办。请帮忙?
谢谢, 詹妮弗
【问题讨论】:
-
哇,这听起来很糟糕,为什么要在应用程序中动态创建表 - 如果它们在 3 个字符上不同,您应该有一个名为
CMDB_CI的表和一个长度为 3 个字符的列来存储代码。您不想在 SQL 中动态创建表。也就是说,我会回答您的问题,您使用的是什么平台,SQL Server、DB2、Oracle 或 mySQL 或 Progress? -
您不能在 SQL 查询中对表进行参数化。我同意@Hogan - 看起来你最终得到了一些你希望能够查询的数据实际上嵌入在表名中 - 这是数据和元数据的错误混合。
-
我使用的是 SQL Server 2008。我问应用程序的支持团队为什么这样设置,并被告知因为表是为属性设置的,然后每种类型可以有不同的属性每个属性的列名可能不同。一个列名可能是“Color”,另一个可能是“SerialNumber”。但我完全同意你的看法。我会以非常不同的方式进行设置。
-
@Jennifer - 属性名称应该在不同的表中。这显然是一个糟糕的设计。 SQL 确实让您“动态”了一个语句,如我的回答所示。它会比非动态 SQL 慢。
标签: sql sql-server function variables dynamic