0

我正在构建一个可以在任何 MS SQL Server 上运行的 SQL 脚本,其中会发生以下情况:

将使用 ID #、dbname 和已处理的?柱子。

然后系统将遍历临时表中的每一行,使用 dbname 作为 SQL 语句的一部分。

这是我目前拥有的:

DECLARE @ID INT
CREATE TABLE #DBNAME (ID varchar(3), dbname varchar(100), processed varchar(1))
BEGIN
INSERT INTO #DBNAME(ID, dbname)
SELECT database_id, name FROM sys.databases
END
BEGIN
UPDATE #DBNAME SET processed = '0'
WHERE dbname IS NOT NULL
END
BEGIN


END
select * from #DBNAME
WHILE (SELECT COUNT(*) From #DBNAME Where processed = 0) > 0
BEGIN
    SELECT TOP 1 @ID = ID from #DBName Where processed = 0
    select * from [#DBNAME.dbname].installinfo where installed='Success'

目前,#DBName.dbname.installinfo它不起作用,因为它不是一个有效的对象,我不知道该怎么做。脚本不会在那里完成,好像 select 语句返回的行数超过零,它需要收集额外的信息,但我想如果我能得到[#DBNAME.dbname]正确的部分,我可以把它放进去,这样我就可以开始工作了在迭代的数据库中。

有任何想法吗?

4

2 回答 2

1

您需要使用动态 sql 将表中的值用作另一个查询中的表名,即:

DECLARE @sql VARCHAR(8000),@tblname VARCHAR(255)
SET @tblname = SELECT stuff FROM Table
SET @sql = 'select * from '+@tblname+' where installed=''Success''
           '

EXEC (@sql)
于 2013-06-28T18:04:38.977 回答
1

我建议编写一个动态 sql 语句:

将@dbname 声明为 NVARCHAR(MAX);
SELECT @dname = name FROM #DBNAME 其中 ID = @ID;
将@sql 声明为 NVARCHAR(MAX);
SET @sql = 'SELECT * FROM ' + @dbname + '.installinfo where installed = ''Success''';
执行 sp_executesql @sql;

于 2013-06-28T18:04:41.817 回答