2016-10-27 65 views
0

我创建了一个游标,它遍历所有数据库并显示每个数据库的1条记录。sql游标将结果插入表中

我希望将记录插入到我可以查看它的1个表中。该查询可能会改变这是为什么我不想为特定查询创建表结构并插入它。我想用“选择为”条款,但将在第二次失败光标运行

DECLARE @DB_Name varchar(100) 
DECLARE @Command nvarchar(200) 
DECLARE database_cursor CURSOR FOR SELECT name FROM #DBNAME 

OPEN database_cursor 

FETCH NEXT FROM database_cursor INTO @DB_Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SELECT @Command = 'use [' + @DB_Name + '] Select '''+ @DB_Name + ''' ,'+ 

--Enter query below 
'* from authentication where username like ''%[email protected]%'' and password = ''Rohan2410''' 

-- print @Command 
EXEC sp_executesql @Command 


FETCH NEXT FROM database_cursor INTO @DB_Name 
END 

CLOSE database_cursor 
DEALLOCATE database_cursor 
+1

你在这里试图做什么并不完全清楚。我得到关于查看所有数据库的部分。但之后就没有意义了。你提到select into,但不在你的代码中。真的,你不需要一个光标。您可以以不同的方式利用动态sql。如果你能解释你想要的输出,我会告诉你我在说什么。 –

+0

您不应该需要'Use db'语句。只需使用dbname.dbo.tablename语法来限定表名。 –

+0

不要使用**“select into”**子句在你的情况下,“select into”子句会自动创建一个新表,因此下次查询将失败,因为引擎想要创建的表名是已经存在。 通过插入临时表转到另一种方法,然后在游标结束后通过SELECT INTO将临时表中的数据插入到新表中 –

回答

1

你应该更好地使用INSERT INTO ...而不是SELECT INTO,像这样的:

DECLARE @DB_Name varchar(100) 
DECLARE @Command nvarchar(200) 
DECLARE database_cursor CURSOR FOR SELECT name FROM #DBNAME 

OPEN database_cursor 

FETCH NEXT FROM database_cursor INTO @DB_Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SELECT @Command = 'use [' + @DB_Name + '] 

    IF OBJECT_ID(''tempdb..##output'') IS NULL 
     BEGIN 
      SELECT NULL AS DB_Name,* 
      INTO ##output 
      FROM authentication WHERE 1=0 
     END 

    INSERT INTO ##output 
    Select '''+ @DB_Name + ''' ,'+ 

--Enter query below 
'* from authentication where username like ''%[email protected]%'' and password = ''Rohan2410''' 

-- print @Command 
EXEC sp_executesql @Command 


FETCH NEXT FROM database_cursor INTO @DB_Name 
END 

CLOSE database_cursor 
DEALLOCATE database_cursor 

SELECT * FROM ##output 

DROP TABLE ##output 

基本上,在第一次游标迭代时,我们将创建一个具有正确结构的空临时表。然后我们只需插入该临时表。