我遇到了这种困境,我正在创建一个使用其中数据库中的表的过程。说:
CREATE PROCEDURE uspRetrieveCurrentPropertyDate (
@InternalEntityId VARCHAR(10)
,@InternalUserId VARCHAR(10)
,@InternalSiteId VARCHAR(10) --this is the database I need to get the table from
)
as begin
...
...
select TOP 1 arsDailyCtlDate from @InternalSiteId..AccountsSetting
end
但当然会返回错误。
原始脚本使用类似:
SET @cSQL = 'SELECT TOP 1 arsDailyCtlDate FROM S' + @SiteID + '.dbo.AccountsSetting WITH (NOLOCK)'
EXEC(@cSQL)
完成任务。但我想重写代码。无论如何我能以我喜欢的方式去做吗?不使用exec(@cSQL)?
谢谢, 舍温
答案 0 :(得分:1)
有一种方法可以在没有动态SQL的情况下完成所需的操作,但这是一项维护噩梦。你可以这样做:
IF @InternalSiteId = 'DatabaseA'
SELECT TOP 1 arsDailyCtlDate FROM DatabaseA..AccountsSetting
ELSE IF @InternalSiteId = 'DatabaseB'
SELECT TOP 1 arsDailyCtlDate FROM DatabaseB..AccountsSetting
ELSE IF @InternalSiteId = 'DatabaseC'
SELECT TOP 1 arsDailyCtlDate FROM DatabaseC..AccountsSetting
等等,用户可以选择的每个可能的数据库。在添加新数据库时,您需要更新proc来处理它们。
你可能最好使用动态sql解决方案,但这样可行。