为SQL Server中的所有数据库添加表

为SQL Server中的所有数据库添加表,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,是否可以在某个位置添加一个表,使该实例中的所有数据库都可以访问该表 谢谢您可以创建“主”数据库,并通过SQL查询从该SQL Server实例中的任何其他数据库访问它。这只是用户权限的问题。表或视图名称的完整语法是数据库.schema.object\u名称 SELECT * FROM mytable AS t INNER JOIN Main.dbo.SharedTable AS s ON t.Id=s.Id .... Chack documentation还-编辑:我添加了第二个解决方案。 第一

是否可以在某个位置添加一个表,使该实例中的所有数据库都可以访问该表

谢谢

您可以创建“主”数据库,并通过SQL查询从该SQL Server实例中的任何其他数据库访问它。这只是用户权限的问题。
表或视图名称的完整语法是
数据库.schema.object\u名称

SELECT * FROM mytable AS t
INNER JOIN Main.dbo.SharedTable AS s ON t.Id=s.Id
....

Chack documentation还-

编辑:我添加了第二个解决方案。

第一种解决方案您可以尝试使用未记录的系统过程:

第二个解决方案您可以使用所有
CREATE TABLE
语句生成
T-SQL
脚本:

SET NOCOUNT ON;

PRINT 'BEGIN TRAN;'
/*
SELECT  
    'USE ' 
    + QUOTENAME(db.name) 
    + ';'
    + '
    CREATE TABLE CocoJamboTable (
        ID INT IDENTITY PRIMARY KEY,
        FirstName NVARCHAR(50) NOT NULL,
        LastName NVARCHAR(50) NOT NULL
    );'
    + CHAR(13)
*/
SELECT  
    CASE 
        WHEN db.name IN ('master','model','tempdb','msdb','ReportServer','ReportServerTempDB','ASPNETDB')
            THEN '-- Explicit skipping: '   + QUOTENAME(db.name)
        WHEN db.state <> 0 
            THEN '-- Implicit skipping (not online): '  + QUOTENAME(db.name)
        WHEN db.is_read_only=1
            THEN '-- Implicit skipping (read only): '   + QUOTENAME(db.name)                
        --WHEN other filter
        --  THEN '-- Implicit skipping (my filter): '   + QUOTENAME(db.name)                
        ELSE 
            'CREATE TABLE ' + QUOTENAME(db.name) + '.dbo.CocoJamboTable (
                ID INT IDENTITY PRIMARY KEY,
                FirstName NVARCHAR(50) NOT NULL,
                LastName NVARCHAR(50) NOT NULL
            );'
        END 
        + CHAR(13)
FROM    sys.databases db
ORDER BY db.name;

PRINT 'ROLLBACK;'
PRINT '-- COMMIT;'

我不想创建链接服务器。我想要一个类似系统视图的东西,可以从所有数据库访问。这不是链接服务器。链接服务器意味着您的“共享”数据库位于另一个SQL server实例上。您不必另外配置任何内容。请再试一次。仅供参考,使用链接服务器引用表还需要由4部分组成的名称[LinkedServerName]。[DatabaseName]。[SchemaName]。[TableName]。要引用同一服务器上另一个数据库中的表,只需使用由3部分组成的名称。[DatabaseName].[SchemaName].[TableName]否,请停止推荐
sp\msforeachdb
。它没有文档记录,不受支持,并且完全被破坏()。请参阅和@AaronBertrand:谢谢您的评论。我有时将此存储过程用于临时任务。是的,它是没有文件的,我写过。它跳过了一些数据库:是的。这就是我编写第二个
sp\msforeachdb
的原因。对于其他问题,我使用事务:
begintransaction。。。为。。。回滚/提交。对于
dbo.ForEachDB\u MyWay
,在跳过只读/非联机数据库时,如果看到一条警告就好了。@AaronBertrand:我添加了第二个解决方案。非常感谢。
SET NOCOUNT ON;

PRINT 'BEGIN TRAN;'
/*
SELECT  
    'USE ' 
    + QUOTENAME(db.name) 
    + ';'
    + '
    CREATE TABLE CocoJamboTable (
        ID INT IDENTITY PRIMARY KEY,
        FirstName NVARCHAR(50) NOT NULL,
        LastName NVARCHAR(50) NOT NULL
    );'
    + CHAR(13)
*/
SELECT  
    CASE 
        WHEN db.name IN ('master','model','tempdb','msdb','ReportServer','ReportServerTempDB','ASPNETDB')
            THEN '-- Explicit skipping: '   + QUOTENAME(db.name)
        WHEN db.state <> 0 
            THEN '-- Implicit skipping (not online): '  + QUOTENAME(db.name)
        WHEN db.is_read_only=1
            THEN '-- Implicit skipping (read only): '   + QUOTENAME(db.name)                
        --WHEN other filter
        --  THEN '-- Implicit skipping (my filter): '   + QUOTENAME(db.name)                
        ELSE 
            'CREATE TABLE ' + QUOTENAME(db.name) + '.dbo.CocoJamboTable (
                ID INT IDENTITY PRIMARY KEY,
                FirstName NVARCHAR(50) NOT NULL,
                LastName NVARCHAR(50) NOT NULL
            );'
        END 
        + CHAR(13)
FROM    sys.databases db
ORDER BY db.name;

PRINT 'ROLLBACK;'
PRINT '-- COMMIT;'
BEGIN TRAN;

CREATE TABLE [Comisioane].dbo.CocoJamboTable (
                ID INT IDENTITY PRIMARY KEY,
                FirstName NVARCHAR(50) NOT NULL,
                LastName NVARCHAR(50) NOT NULL
            );

-- Implicit skipping (read only): [Credite]

-- Explicit skipping: [master]

-- Explicit skipping: [model]

-- Explicit skipping: [msdb]

-- Explicit skipping: [ReportServer]

-- Explicit skipping: [ReportServerTempDB]

CREATE TABLE [SIMUR4].dbo.CocoJamboTable (
                ID INT IDENTITY PRIMARY KEY,
                FirstName NVARCHAR(50) NOT NULL,
                LastName NVARCHAR(50) NOT NULL
            );

ROLLBACK;
-- COMMIT;