有没有办法根据没有IF语句的参数集从表名中进行选择?

时间:2018-02-12 21:17:08

标签: sql-server dynamic-sql

我有一个场景,其中一个" 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'

我该如何解决这个问题?

1 个答案:

答案 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)

得到了理想的结果。