1,同一台服务器实例,有多个数据库如(dba,dbb,dbc,dbd...),都有相同的存储过程 p_pro,其返回值为 int 型(该 p_pro 存储过程的功能是完成对本数据库其中一个表的数据插入,并且返回该 @@identity )。2,现在要在 dbm 里面写存储过程 p_prom 调用dba,dbb,dbc... 其中一个数据库里的存储过程 p_pro 并且获得其返回值, 数据库名称 dba, dbb 等在 p_prom 里当作一个参数 @dbname 传入。请问,在 p_prom 里如何处理才能实现上述第二项要求?

解决方案 »

  1.   

    首先执行p_prom的用户,必须有执行其他库存储过程的权限
    然后就简单了,如果你的p_pro存储过程的返回值设置的output类型,就可以
    declare @id int
    exec dba..p_pro @id output如果不是,就麻烦一点了,需要先创建一个临时表然后
    insert into #t exec dba..p_pro
      

  2.   

    问题是在 p_prom 中,把数据库名称用varchar 型 参数传入的。
      

  3.   

    创建存储过程
    ----------------
    USE DBM
    GOCREATE PROCEDURE P_PROM @DB_Name VARCHAR(18)
    AS
    BEGIN
     DECLARE @SQL VARCHAR(128)
     SET @SQL ='EXEC '+@DB_Name+'.DBO.P_PRO'
     EXEC(@SQL)
    END
    ---------------------调用存储过程
    EXEC  DBM.[dbo].[PRO_PM] @DB_Name = N'TEST2'
    --------------------------
    如果有其他的参数,LZ自己想办法拼接进@SQL好了
      

  4.   

    创建存储过程
    ----------------
    USE DBM
    GOCREATE PROCEDURE P_PROM @DB_Name VARCHAR(18)
    AS
    BEGIN
     DECLARE @SQL VARCHAR(128)
     SET @SQL ='EXEC '+@DB_Name+'.DBO.P_PRO'
     EXEC(@SQL)
    END
    ---------------------调用存储过程
    EXEC  DBM.[dbo].[PRO_PM] @DB_Name = N'DBA'
    --------------------------
    如果有其他的参数,LZ自己想办法拼接进@SQL好了
      

  5.   

    关键是要获取  EXEC(@SQL) 中 dba..p_pro 的返回值
      

  6.   

    [/img]
    为什么LZ就是不听我的话呢,我说了“其他的参数可以拼接上去”。存储过程的参数分为两种,Input与Output,无论哪种都是参数,明白了没?要是还不明白,那就看看下述的例子吧CREATE PROCEDURE [dbo].[PRO_P] @IDENTITY INT OUTPUT
    AS
    BEGIN
     INSERT INTO UserInfo( Name)
     VALUES(N'张三')
     SELECT @IDENTITY= @@IDENTITY
    END
    CREATE PROCEDURE [dbo].[PRO_PM] @DB_Name VARCHAR(12)
    AS
    BEGIN
     DECLARE @SQL VARCHAR(128)
     SET @SQL='DECLARE @RESULTID INT '
     SET @SQL =@SQL+'EXEC '+@DB_Name+'.DBO.PRO_P @RESULTID OUTPUT '
     SET @SQL=@SQL+'SELECT @RESULTID AS RESULTID'
     EXEC(@SQL)
    END[img=http://img.my.csdn.net/uploads/201303/25/1364181172_7728.jpg]UC?
      

  7.   

    如果LZ要返回的结果比较多,那就建议不要用堆栈了,建立一张表,含一唯一主键,保存结果,利用OUTPUT返回主键即可。
    OK?