我有一个场景,其中一个" ID" s决定使用哪些表。
Eg: If ID = **1**
Then use EE**1**TimeHour and EE**1**TimeOff
If ID = **2**
Then use EE**2**TimeHour and EE**2**TimeOff
目前有4个ID,proc很长,唯一的区别是表的名称。
我不想使用If语句(如果可能跳过)的原因是因为其余代码是重复的。只是表名的不同可能是一个错误的设计决定,但我不是那个设计它的人。 我尝试在动态SQL中使用下面的代码,但它给出了错误:
" Msg 102,Level 15,State 1,Line 159 tablename"附近的语法不正确
(因为我假设它不允许)。
DECLARE @ID int
DECLARE @SQL nvarchar(max) = ''
select @ID = ID from table a
SELECT @SQL = 'select T.* from EE' + CAST(@ID as NVARCHAR(1)) + 'TimeHour T'
我该如何解决这个问题?
答案 0 :(得分:0)
添加一个额外的变量,只需将TableString + TableId连接到该变量中。
DECLARE @ID int
DECLARE @SQL nvarchar(max) = ''
select @ID = ID from table a
DECLARE @TableName nvarchar(max) = CONCAT('EE', @ID, 'TimeHour')
SELECT @SQL = 'select * from @TableName
完成所有操作后,您需要执行
exec (@sql)
为了让它使用表名的变量。
作为一个例子,我在自己的数据库上运行它:
DECLARE @TableName varchar(100) = '[Database].[dbo].[Table]'
DECLARE @Statement varchar(200) = 'Select Top 100 * FROM ' + @TableName
EXEC (@Statement)
得到了理想的结果。