2010-03-21 26 views
0

我正在研究一個腳本,該腳本需要在許多不同的SQL Server中運行。其中一些共享相同的結構,換句話說,它們是相同的,但文件組和數據庫名稱不同。這是因爲每個客戶一個。只有在數據庫包含模式時才創建視圖或SP

無論如何,我想運行一個腳本時,如果我選擇了錯誤的數據庫,它不應該被執行。我試圖維護一個乾淨的數據庫。這裏是我的例子,它只適用於刪除視圖(如果存在),但不適用於創建新視圖。我也想知道如何創建一個存儲過程。

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 
+0

你的問題到底是什麼? – 2010-03-21 15:24:03

+0

你說..「但不適用於創建一個新的」。它是否在創建新視圖時拋出任何錯誤? – 2010-03-21 15:33:20

回答

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 
') 

注意:視圖名是否意味着不同?

+0

非常感謝您的回答。它確實有效。視圖名稱意思是一樣的,我只是在那裏有一個錯字。我喜歡運行鍼對特定類型數據庫的腳本。這是因爲我有超過50臺服務器需要維護,而且我討厭錯誤地運行一個SP或者它並不意味着要運行的功能。 Thx再次。 – 2010-03-22 20:59:33

相關問題