问题描述
如何将声明的临时变量放入FROM和JOIN数据库命令中?
我们的SIS保留每个学期的GPA,但将班级(以及许多其他课程)作为时间点,没有历史记录,因此我可以查询过去的DB来收集某些时间段的信息。这意味着我必须单击并键入很多单调的字符串,所以我想为这些调用声明一个变量。
我正在查询后一个术语数据库以获取某些信息,并在子查询中加入前一个术语数据库以获取另一个信息,所以我也想为整个数据库调用声明USE语句
我目前有,但这只是最近一次失败的尝试:
DECLARE @term AS VARCHAR(7)
SET @term = 'FA2019';
SELECT GPA blah blah
FROM db AS a
JOIN ( SELECT CLASS_LEVEL blah blah
FROM FROM [snapshotdb_+@term].[dbo].[sub1]
JOIN [snapshotdb_+@term].[dbo].[subjoin]
) b
where a.STTR_TERM IN ( @term )
解决方法
使用动态sql能够动态地为您使用from和inner子句中的差异数据库。
PS:您还必须为JOIN设置ON子句
示例:
DECLARE @term AS VARCHAR(7)
SET @term = 'FA2019';
declare @sql nvarchar(max) = N'
SELECT GPA blah blah
FROM db AS a
JOIN ( SELECT CLASS_LEVEL blah blah
FROM ' + quotename('snapshotdb_' + @TERM) + '.[dbo].[sub1]
JOIN ' + quotename('snapshotdb_' + @TERM) + '.[dbo].[subjoin]
) b
where a.STTR_TERM IN ( ' + replace(@term,'''','''''') + ' )
';
exec (@sql);