Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用“;插入”;仅适用于具有特定表的数据库(SQL Server 2008 R2)_Sql_Sql Server_Sql Server 2008 R2_Cursor - Fatal编程技术网

使用“;插入”;仅适用于具有特定表的数据库(SQL Server 2008 R2)

使用“;插入”;仅适用于具有特定表的数据库(SQL Server 2008 R2),sql,sql-server,sql-server-2008-r2,cursor,Sql,Sql Server,Sql Server 2008 R2,Cursor,我需要在我将要创建的新表(具有相同的结构)中使用某个表、所有数据库的所有信息进行“日志” 但并非所有数据库都有此表 我可以进行查询以查找包含我想要的表的所有数据库: SELECT name FROM sys.databases WHERE CASE WHEN state_desc = 'ONLINE' THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[tblLogdiscador]', 'U')

我需要在我将要创建的新表(具有相同的结构)中使用某个表、所有数据库的所有信息进行“日志”

但并非所有数据库都有此表

我可以进行查询以查找包含我想要的表的所有数据库:

SELECT name
FROM   sys.databases
WHERE  CASE
         WHEN state_desc = 'ONLINE' 
              THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[tblLogdiscador]', 'U')
       END IS NOT NULL 
它将只列出包含我要记录的表的数据库。但现在我需要做一个循环,遍历所有数据库,将“tbllogdiscador”的信息插入到我创建的表中。我在SP_MSFOREACHDB中考虑过,但我看到很多人说不要使用它

我如何在所有拥有该表的数据库中循环,如果有,则插入到新的日志表中

下面的代码对我没有帮助:

exec sp_msforeachdb 'if ((select count(*) 
    from [?].sys.tables Where name in(''tbllogdiscador''))=1)
 begin 
      insert into [The new tbl log]
        select * from ?.dbo.tbllog
 end
我正在尝试使用光标,但遇到了问题


想知道如何在WHILE中实现这一点吗?

要实现您的想法,您需要某种流程逻辑(A似乎是最合适的选择),并且

因此,最重要的是我们需要获取所有的DB名称,将它们放在游标中,然后使用游标执行动态sql语句,您可以在其中测试是否存在表的名称,如果存在,则提取记录

好的,下面是一个示例游标,它在服务器上的DBs中循环,查找特定的表名,如果它存在,则执行某些操作(您必须为@Sql2执行sql):


为了实现您的想法,您需要某种流程逻辑(A似乎是最合适的选择),以及

因此,最重要的是我们需要获取所有的DB名称,将它们放在游标中,然后使用游标执行动态sql语句,您可以在其中测试是否存在表的名称,如果存在,则提取记录

好的,下面是一个示例游标,它在服务器上的DBs中循环,查找特定的表名,如果它存在,则执行某些操作(您必须为@Sql2执行sql):

declare @DBName varchar(256) 
declare @SQL1 nvarchar(max)
declare @Sql2 nvarchar(max)

DECLARE db_cursor CURSOR FOR  
SELECT name 
FROM sys.databases
WHERE state_desc = 'ONLINE'

OPEN db_cursor   
FETCH NEXT FROM db_cursor INTO @DBName

WHILE @@FETCH_STATUS = 0
Begin
set @SQL1 = 'Select Name from ' + @DBName + '.sys.objects where name = ''tblLogdiscador'' '

set @SQL2 = --Your select and insert statement selecting from @DBName + 'dbo.tbllogdiscador'

if exists(exec sp_executesql @Sql1)
  begin
    exec sp_executesql @sql2
  end

FETCH NEXT FROM db_cursor INTO @DBName

end
close db_cursor
deallocate db_cursor