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
谢谢
答
你将不得不使用动态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
这通常表示数据模型中断 - 您以不恰当的方式将数据和元数据混合在一起。它通常也是属性拆分的指示 - 其中数据将根据隐含属性进入多个表中的一个,而不是将该属性精确建模为列的单个表。 (例如,典型的不好的例子是有'MaleEmployees'和'FemaleEmployees'表,而不是'Employees'表,'Gender'包含在列中) –
实际的查询不是这么简单,我不是架构师 - 只是寻找一种更有效的插入数据的方式。谢谢 – Elle
尝试使用select ... into#[临时表],@Elle –