SQL Server +变量查找中的变量表名称

问题描述:

我有一个查询,其中我想将表名称[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 –

你将不得不使用动态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。

如果你还没有准备好改变你的数据模型,但你的表(表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