根据对sproc的输入动态选择不同的DB

时间:2011-10-05 15:58:07

标签: sql database stored-procedures dynamic case

我正在尝试从1个特定数据库的硬编码选择中更改数据库中的存储过程,以便能够根据传入sproc的id从任何数据库中进行选择。这是sproc为我们做的事情的存根:

ALTER PROCEDURE [dbo].[GetByAdId]
(
@AdId int,
@UserCompanyId int
)
AS
SET NOCOUNT ON

SELECT  
    [User].[UserId],
    UserMappings.IsActive,
    IsAccountOwner = ( SELECT Count(*) FROM DB1_SetUp.dbo.ad Adv WHERE Adv.AdID = UserMappings.AdID AND Adv.PrimaryAccountOwnerID = [User].[UserId] )
FROM   
    [User] INNER JOIN UserMappings ON 
    (
        UserMappings.UserID = [User].UserID
        AND UserMappings.AdID = @AdId
        AND UserMappings.UserCompanyId = @UserCompanyId 
    )

基本上,“IsAccountOwner”变量是硬编码的,每次都可以从DB1_SetUp中进行选择,但我们有不同组的SetUp db,如DB2_SetUp,DB3_SetUp等。将UserCompanyId变量传递给sproc函数,就像一个组Id可用于指向我希望它选择的特定SetUp DB,但我不知道如何做到这一点。我基本上想要的东西是:

SELECT * FROM (
    CASE @UserCompanyId
        WHEN 3 THEN 'DB3_SetUp'
        WHEN 4 THEN 'DB4_SetUp'
)

有没有干净的方法来执行此操作,或者我是否必须在每个组DB上设置此sproc并在每个DB上调用特定的sproc?

1 个答案:

答案 0 :(得分:0)

我过去通过动态构建我想要执行的SQL(基于传入的参数)然后使用sp_executesql

执行SQL来完成此操作

请参阅:http://msdn.microsoft.com/en-us/library/ms188001.aspx