0

我正在尝试从需要在变量中的表中进行选择。我正在使用从应用程序动态创建的表。该表将命名为 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 

我不知道该怎么办。请帮忙?

谢谢,詹妮弗

4

2 回答 2

1
-- This part would be a SP parameter I expect
DECLARE @tableName varchar(100)
SET @tableName = 'CMDB_CI_508'

-- Main SP code
DECLARE @sqlStm VARCHAR(MAX)

SET @sqlStm = 'SELECT * 
FROM '+ @tableName

EXEC (@sqlStm)

小提琴http://sqlfiddle.com/#!3/436a7/7

于 2013-07-26T17:48:35.697 回答
0

首先,是的,我知道这是一个糟糕的设计。我没有设计它。它附带了我公司为我们的呼叫中心购买的问题跟踪软件。所以我完全放弃了我想要的方法,并使用游标将各种表中的所有名称拉到一个临时表中,然后使用所述临时表加入原始查询。

ALTER Proc [dbo].[CI_CurrentItems]

As

Declare @CIType nvarchar(6)
Declare @Qry nvarchar(100)
/*
Create Table Temp_CI 
( T_CI_ID int,
  T_CI_Type_ID int,
  T_Name nvarchar(400)
)
*/

Truncate Table Temp_CI

Declare CI_Cursor Cursor For 
select distinct CI_TYPE_ID  FROM [footprints].[dbo].[CMDB50_CI_COMMON]
where STATUS <> 'Retired'

Open CI_Cursor

Fetch Next from CI_Cursor into @CIType

While @@FETCH_STATUS = 0
BEGIN
Set @Qry = 'Select CI_ID, CI_Type_ID, Name from Footprints.dbo.CMDB50_CI_' + @CIType 
Insert into Temp_CI Exec (@Qry)
Fetch Next from CI_Cursor into @CIType
END

Close CI_Cursor
Deallocate CI_Cursor

SELECT  CI_ID,
    C.CI_TYPE_ID,
    CI_CUSTOM_ID,
    STATUS,
    CI_TYPE_NAME,
    T_Name
FROM [footprints].[dbo].[CMDB50_CI_COMMON] c
JOIN [footprints].[dbo].[CMDB50_CI_TYPE] t
ON c.CI_TYPE_ID = t.CI_TYPE_ID 
JOIN Temp_CI tc
ON c.CI_ID = tc.T_CI_ID
AND t.CI_TYPE_ID = tc.T_CI_TYPE_ID
WHERE STATUS <> 'retired'
ORDER BY CI_TYPE_NAME 
于 2013-07-26T22:09:41.553 回答