如何在T-SQL存储过程中访问另一个数据库中的表

时间:2014-08-25 18:36:01

标签: sql sql-server

我可以使用完全限定的名称(如

)访问另一个数据库中的表
select * from [DEV-test].dbo.ArchiveCutoff

现在我想在存储过程中执行相同的表。

我的代码是

create procedure test  
    @src varchar (128) 
as
begin
  set @src = '[DEV-test]'
  select * from  @src.dbo.ArchiveCutoff
end

但是我收到了一个错误:

  

Msg 102,Level 15,State 1,Line 12
  '。'。

附近的语法不正确

这样做的正确方法是什么。

3 个答案:

答案 0 :(得分:1)

您似乎正在使用the textbook examples之一来查找动态SQL。这通常是个坏主意,尽管有一些解决方法。如果您阅读链接的文章,则会提供一些建议。

但是,如果你必须使用它,那么你正在寻找

create procedure test  @src varchar (128) as
begin

 set @src = QUOTENAME(@src) -- leave this 
 set @src = '[DEV-test]'

 declare @sql varchar(200)
 set @Sql = 'select * from ' + @src + '.dbo.ArchiveCutoff'

 EXEC (@SQL)


end

create procedure test  @src varchar (128) as
begin

 set @src = QUOTENAME(@src) -- leave this 
 set @src = '[DEV-test]'


 EXEC ('select * from ' + @src + '.dbo.ArchiveCutoff')


end

答案 1 :(得分:0)

使用内联查询

create procedure test 
( @src varchar (128) )as
begin
 set @src = '[DEV-test]'
 declare @x varchar(100)
 @x = 'select * from' +  @src +'.dbo.ArchiveCutoff'
 exec(@x)
end

答案 2 :(得分:0)

我发布了对前两个答案的修改。我在您的代码中意识到您传递了一个参数,然后将其设置为硬编码值。我认为这是出于测试目的。问题是,一旦删除该行,两个发布的解决方案都容易受到SQL注入攻击。对这两个优秀的先前答案的微小改动可能是这样的,以防止sql注入。

create procedure test 
( 
    @src varchar (128) 
)as
    --Presumably this line will be removed after testing. 
    --And because we are using QUOTENAME you want the actual name here with no brackets.
    set @src = 'DEV-test' 

    set @src = QUOTENAME(@src) --This is to help prevent sql injection
    declare @x nvarchar(100)
    set @x = N'select * from ' +  @src +'.dbo.ArchiveCutoff'
    --uncomment the exec line when comfortable your code is correct
    --exec sp_executesql @x

    select @x
GO