【问题标题】:SQL Server Dynamic Stored ProcedureSQL Server 动态存储过程
【发布时间】:2011-02-28 18:16:33
【问题描述】:

我有存储过程。为此,我需要将数据库名称作为来自另一个应用程序或另一个 SP 的参数传递。我知道动态 SQL 的方法,比如,

Create procedure mysp(@dbname varchar(20))
as
begin
declare @sql varchar(max)
set @sql='select * from '+@dbname+'.dbo.table'
end

exec mysp 'mydb'

但我不希望将 SQL 语句作为字符串。因为在我的 SP 中,我有许多 Sql 语句即将到来(不像这样只有 SELECT 语句)。那我可以用吗,

USE DatabaseName

在存储过程中,这样我就可以直接在 sql 语句中使用数据库名称,而无需将其作为字符串。或者有任何其他方法。 我的要求,仅针对数据库名称,我不希望整个 sql 语句是动态的... 请帮帮我。 提前致谢。

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    您可以将USE 指令添加到您正在创建的动态查询中。然后,您可以在没有限定符的情况下使用该数据库的表和其他对象(在动态查询中):

    Create procedure mysp(@dbname varchar(20))
    as
    begin
    declare @sql varchar(max)
      set @sql='use '+@dbname;
      set @sql=@sql + ';select ... from dbo.table1';
      set @sql=@sql + ';update dbo.table2...';
      set @sql=@sql + ';insert into dbo.table3...';
      ...
      exec(@sql);
    end
    
    exec mysp 'mydb'
    

    然而,虽然你可以这样做,但它不是你应该做的事情,除非你真的必须这样做。您可能试图避免在不同的 DB 中创建相同的过程,但这种方法可能会给您带来其他问题,或者剥夺您自己在不诉诸 SP 中的动态查询的情况下可能拥有的一些优势。

    【讨论】:

    • declare @sql varchar(max) set @sql='USE '+@dbname 然后继续 DML 查询...它正在工作
    • @Robin clave:你的意思是按照我的建议去做吗?还是您只在动态查询中包含USE... 而其余语句是SP 的正确部分?
    【解决方案2】:

    不,USE 不允许在存储过程、函数和触发器中使用。

    存储过程应该是数据库本地的。要访问另一个数据库,有一种方法(据我所知),这就是您使用的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多