自动在多个DB上执行同一条sql语句 ( 存储过程版 )

ALTER PROC QueryMultiDB @dbs VARCHAR(2000),@sql VARCHAR(5000)
AS
DECLARE @dbName  VARCHAR(15)  
DECLARE @idx     INT  
DECLARE @tempSql     VARCHAR(5000)  
SET @tempSql=@sql

--判断sql语句是否有dbo, 如果没有则提示并返回. 这个判断也不够精确,靠自己输入把握了. 
IF(CHARINDEX(' dbo.',@sql)<=0)
BEGIN
    RAISERROR( 'sql语句中的所有表名前必须加上dbo., 例如: select * from dbo.tableName',16,1)
    RETURN
END

WHILE (LEN(@dbs) > 0)  
BEGIN  
    SET @idx = CHARINDEX(',', @dbs)
    IF (@idx > 0)  
        BEGIN  
            SET @dbName = SUBSTRING(@dbs, 0, @idx)  
            SET @dbs = SUBSTRING(@dbs, @idx + 1, LEN(@dbs) -@idx)  
        END  
    ELSE  
        SET @dbName = @dbs  
    SET @dbName=LTRIM(RTRIM(@dbName))  
      
    PRINT '----' + @dbName + '----'
    SET @sql=REPLACE(@tempSql,' dbo.',' '+@dbName+'.dbo.')
    --注: 某些地方需要显示dbName, 传入的sql语句应类似: 'SELECT ''@dbName'' as webid,* FROM dbo.table'
    SET @sql=REPLACE(@sql,'@dbName',@dbName) 
    --print (@sql)    --用于调试, 判断动态生成的sql语句是否正确   
    EXEC(@sql)        --执行动态sql  
    
    IF (@idx <= 0)  
        BREAK  
END 

--执行      EXEC QueryMultiDB 'db01,db02' ,'SELECT top 5 ''@dbName'' as webid,* FROM dbo.tableName'

最佳搭档:

枚举所有DB的名称, 以逗号分隔输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值