2017-07-14 59 views
0

我有一個查詢,其中我想將表名稱[TableX]設爲變量。SQL Server +變量查找中的變量表名稱

該查詢需要用不同的變量執行多次。所以我想知道是否可以創建一個可以查找這些變量值的(temp)表格?

例如

list language Table 
---------------------------- 
51  152   TableX 
52  154   TableY 
53  156   TableZ 

代碼:

declare @list int='51'  -- change 
declare @language int='152' -- change 

insert into [DB].[Table] ([list], [value2], [language]) 
    Select 
     @list, value2, @language 
    From 
     [DB2].[TableX] -- change table name 

謝謝

+3

這通常表示數據模型中斷 - 您以不恰當的方式將數據和元數據混合在一起。它通常也是屬性拆分的指示 - 其中數據將根據隱含屬性進入多個表中的一個,而不是將該屬性精確建模爲列的單個表。 (例如,典型的不好的例子是有'MaleEmployees'和'FemaleEmployees'表,而不是'Employees'表,'Gender'包含在列中) –

+0

實際的查詢不是這麼簡單,我不是架構師 - 只是尋找一種更有效的插入數據的方式。謝謝 – Elle

+0

嘗試使用select ... into#[臨時表],@Elle –

回答

0

你將不得不使用動態SQL來做到這一點:

declare @list int='51'  -- change 
declare @language int='152' -- change 
DECLARE @TableX varchar(100) = 'TableX' 
DECLARE @SQL varchar(500) 

SET @SQL = 'insert into [DB].[Table] ([list], [value2], [language]) 
Select ' + CAST(@list as varchar(5)) + ' , value2, ' + CAST(@language as varchar(5)) + ' 
From 
    [DB2].[' + @TableX + '] ' 

exec @SQL 

當然,這是一個簡單的例子,我會強烈建議您將其參數化和使用,而不是高管的ExecuteSQL。

0

如果你還沒有準備好改變你的數據模型,但你的表(表A,...,TableZ)是相同的,你可以使用視圖這樣的:

CREATE VIEW MyTables 
AS 
    SELECT [value1], [value2], [value3], [value4], 'TableA' AS TableName 
    FROM [DB2].[TableA] 

    UNION ALL 

    /* 
    . 
    . 
    . 
    . 
    . 
    */ 

    SELECT [value1], [value2], [value3], [value4], 'TableY' 
    FROM [DB2].[TableY] 

    UNION ALL 

    SELECT [value1], [value2], [value3], [value4], 'TableZ' 
    FROM [DB2].[TableZ] 
GO 

,然後使用:

declare @list int= 51  -- change 
declare @language int = 152 -- change 

insert into [DB].[Table] 
     ([list] 
     ,[value2] 
     ,[language]) 

Select 
     @list, 
     value2, 
     @language 
FROM MyTables m 
    JOIN [SomeTable] s ON s.[Table] = m.TableName 
WHERE s.list = @list 
    AND s.language = @language