您好我正在尝试运行下面的SQL,它将通过遍历所有名称为“Pull”的数据库来提取名为SourceDestination的表名。sp_executesql中的语法错误
但是我在'[email protected]_name+'.sys.tables附近的加号出现错误。我在两边尝试了N',但我似乎无法让它工作。
它给出了这个错误 Msg 102,Level 15,State 1,Line 20 '+'附近语法不正确。
需要知道我错在哪里。谢谢您的帮助。
declare db_names cursor for
select name
from master.sys.databases
where name like 'Pull_%'
declare @db_name varchar(50)
declare @table_name varchar(50)
declare @sql nvarchar(100)
DECLARE @ParmDefinition NVARCHAR(500);
open db_names
fetch next from db_names into @db_name
while @@FETCH_STATUS = 0
begin
print @db_name
-- set @sql = 'select '[email protected]_name+'=name from '[email protected]_name+'.sys.tables'
-- set @sql = N'select @table_name=name from @db_name.sys.tables where name = ''SourceDestinations'' '
execute sp_executesql N'select @tbl_name=name from '[email protected]_name+'.sys.tables where name = ''SourceDestinations'' ', N'@tbl_name varchar(50) OUTPUT', @[email protected]_name OUTPUT
--exec(@sql)o
print @table_name
FETCH NEXT FROM db_names INTO @db_name
end
close db_names
deallocate db_names
非常感谢!现在没有引发语法错误。但我还有一个问题。游标返回两个数据库名称,但sys.tables上的查询仅适用于返回的第一个数据库名称。对于第二个DB名称,返回前一个DB本身的结果。我添加了一个调试,它显示@db_name变量包含每个迭代的每个数据库的名称,但两个数据库名称的结果相同。 – JunaidKirkire 2012-04-15 13:04:04
@JunaidKirkire - 将查询写入(假设表中的'SourceDestinations'出现在两个数据库中),您将得到两个查询相同的结果。请修改问题以更新您的当前查询,并更详细地描述您要实现的内容。 – 2012-04-15 13:33:52
表格SourceDestinations不存在于第二个数据库中。它仍然显示db_name的第二个值。在sys.tables上运行查询之前,我做了'use'+ db_name。尽管如此,表格'SourceDestinations'被返回。 我以调试模式运行查询,只是为了确保db_name具有第二个数据库的名称。 我想要实现的是遍历所有在其名称中具有'Pull'并查询某些表的数据库。 但是,它似乎只有第一个数据库被查询。 – JunaidKirkire 2012-04-15 14:02:16