如何在程序内动态选择

时间:2015-07-22 13:45:26

标签: sql sql-server database sql-server-2008

我遇到了这种困境,我正在创建一个使用其中数据库中的表的过程。说:

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)?

谢谢, 舍温

1 个答案:

答案 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解决方案,但这样可行。