我有一个存储过程,允许IN参数指定要使用的数据库.然后,我在该数据库中使用预先确定的表进行查询.我遇到的问题是在查询中将表名与该数据库名连接起来.如果T-SQL有一个评估函数,我可以做类似的事情
eval(@dbname + 'MyTable')
目前我卡住创建一个字符串,然后使用exec()
该字符串作为查询运行.这很麻烦,我宁愿不必创建一个字符串.有没有办法可以评估变量或字符串,所以我可以做以下的事情?
SELECT * FROM eval(@dbname + 'MyTable')
我希望它评估,所以它最终出现如下:
SELECT * FROM myserver.mydatabase.dbo.MyTable
Alan Feather.. 16
阅读本文... 动态SQL的诅咒和祝福,帮助我理解如何解决这类问题.
阅读本文... 动态SQL的诅咒和祝福,帮助我理解如何解决这类问题.
没有"整洁"的方式来做到这一点.如果您接受它并查看其他内容,您将节省时间.
编辑: 啊哈!关于OP的评论"我们必须每月将数据加载到新数据库中,否则它会变得太大." 回想起来,令人惊讶的是没有人评论这个问题的微弱气味.
SQL Server提供了处理"太大"(特别是分区)的表的本机机制,这将允许您将表作为单个实体进行处理,同时将表分成背景中的单独文件,从而消除当前问题一共.
换句话说,这是数据库管理员而不是数据库使用者的问题.如果那也是你,我建议你考虑分区这个表.
尝试sp_executesql内置函数.您基本上可以在proc中构建SQL字符串,然后调用
exec sp_executesql @SQLString. DECLARE @SQLString nvarchar(max) SELECT @SQLString = ' SELECT * FROM ' + @TableName EXEC sp_executesql @SQLString