我可以使用完全限定的名称(如
)访问另一个数据库中的表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
附近的语法不正确
'。'。
这样做的正确方法是什么。
答案 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