仅当数据库包含模式时才创建视图或SP

时间:2010-03-21 15:13:30

标签: sql sql-server sql-server-2005 tsql

我正在编写一个需要在许多不同的SQL服务器上运行的脚本。其中一些,共享相同的结构,换句话说,它们是相同的,但文件组和数据库名称是不同的。这是因为每个客户一个。

无论如何,我想在运行脚本时,如果我选择了错误的数据库,就不应该执行它。我试图保持一个干净的DB。这是我的例子,它只适用于删除视图(如果存在),但不适用于创建新视图。我也想知道如何创建存储过程。

IF EXISTS (SELECT * 
             FROM dbo.sysobjects 
            WHERE id = object_id(N'[dbo].[ContentModDate]') 
              AND OBJECTPROPERTY(id, N'IsView') = 1)
     AND CHARINDEX('Content', DB_NAME()) > 0

DROP VIEW [dbo].[ContentModDate]

GO

  IF (CHARINDEX('Content', DB_NAME()) > 0)
  BEGIN
    CREATE VIEW [dbo].[Rx_ContentModDate] AS  
     SELECT 'Table1' AS TableName, MAX(ModDate) AS ModDate
       FROM Tabl1 WHERE ModDate IS NOT NULL
     UNION 
     SELECT 'Table2', MAX(ModDate) AS ModDate 
       FROM Table2 WHERE ModDate IS NOT NULL
  END
END
GO

1 个答案:

答案 0 :(得分:3)

存储过程完全相同。

我也这样做,因为上面的代码不起作用。 CREATE xxxx通常必须首先在批处理中。您的代码也会找到名为“ContentFoo”的数据库

IF OBJECT_ID('dbo.myView') IS NOT NULL AND DB_NAME() = 'Content'
    DROP VIEW [dbo].[ContentModDate]
GO
IF DB_NAME() = 'Content'
EXEC ('
CREATE VIEW [dbo].[Rx_ContentModDate] AS  
 SELECT ''Table1'' AS TableName, MAX(ModDate) AS ModDate
 FROM Table1 WHERE ModDate IS NOT NULL
UNION 
 SELECT ''Table2'', MAX(ModDate) AS ModDate 
 FROM Table2 WHERE ModDate IS NOT NULL
')

注意:视图名称是不同的吗?