我在SQL Server中有一个用户定义的表函数,它聚合来自几个表的数据,包括另一个数据库的几个表。这是在查询中硬编码数据库的名称,但我们希望使数据库名称可配置(因为我们的数据库通常与其他应用程序的数据库共享服务器)。
我尝试使用存储在配置表中的数据库名称在函数内部构造动态查询字符串,但是:
exec(@sqlStatement)
时,SQL Server表示函数内部不允许执行字符串。exec sp_executesql @sqlStatement
并且创建了函数,但是当你执行它时,SQL Server说在函数内部你只能运行扩展函数和过程。所以问题是:是否可以创建一个访问另一个数据库中的表的函数或存储过程,而不必在数据库名称不同时重新创建该函数?
TIA。
答案 0 :(得分:3)
我真的建议您选择固定的数据库名称,这样就可以避免使用动态sql的整个问题。你不能提出像your_company_name_XYZ
和your_company_name_ABC
这样的独特数据库名称吗?如果这不是一个选项,你将做很多动态SQL,你应该阅读The Curse and Blessings of Dynamic SQL by Erland Sommarskog
您在问题中提到的所有限制都是SQL Server功能的限制。您可以在存储过程中生成并执行动态SQL而不会出现任何问题。