我正在构建一个可以在任何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]
部分正确的话所以我可以开始在迭代数据库中工作。
有什么想法吗?
答案 0 :(得分: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)
答案 1 :(得分:1)
我建议写一个动态的sql语句:
DECLARE @dbname AS NVARCHAR(MAX);
SELECT @dname = name FROM #DBNAME其中ID = @ID;
将@sql声明为NVARCHAR(MAX);
SET @sql ='SELECT * FROM'+ @dbname +'。installinfo where installed =''Success''';
EXEC sp_executesql @sql;