Sql-Server

將 SQL 表轉換為視圖 - 使用動態 SQL

  • June 2, 2021

顧名思義,我需要使用動態 SQL 將大量 sql 表轉換為視圖。

出於動機,保留舊程序只是一種愚蠢的解決方法。

到目前為止,我正在創建一個 temptable,遍歷並使用表名填充它,然後創建 vws

到目前為止,這是腳本,無法正常工作。來自 SSMS 的錯誤:“@viewName 附近的語法不正確”ln 17

[USE statement here]
GO

IF OBJECT_ID('tempdb..#tempTables') IS NOT NULL DROP TABLE #tempTables
GO

CREATE TABLE #tempTables (
   tableName nvarchar(128)
   )
GO

INSERT INTO #tempTables
   (tableName)
SELECT NAME FROM sys.tables WHERE TYPE = 'U'
ORDER BY NAME
GO

WHILE (SELECT count(*) FROM #tempTables) > 0

   BEGIN
       DECLARE @tableName nvarchar(128) = (SELECT TOP 1 tableName FROM #tempTables)
       DECLARE @viewName nvarchar(128) = 'vwAccess_' + @tableName
       DECLARE @sqlDrop nvarchar(MAX)

   --1) If @viewName exists drop @viewName
       IF EXISTS (SELECT * FROM sys.views WHERE NAME = @viewName)
       SELECT @sqlDrop = 'DROP VIEW dbo.' + @viewName
       EXEC sp_executesql @sqlDrop
       
   --2) Create @view as 
       EXECUTE('CREATE VIEW @viewName AS SELECT * from tableName')
       
   --3) Delete from tempTable 
       DELETE FROM #tempTables WHERE tableName = @tableName

   END

您的具體錯誤是由於您在Step 2的動態 SQL字元串中直接引用了您的@viewName變數,但它在該上下文中不存在。您必須將變數保存的值連接到您的動態 SQL字元串。可能是這樣的:

DECLARE @dynamicSQL NVARCHAR(MAX) = N'CREATE VIEW ' + QUOTENAME(@viewName) + ' AS SELECT * from tableName'

EXECUTE sp_ExecuteSQL @dynamicSQL

請注意上面範例中的使用,因為出於安全原因sp_ExecuteSQL,這是執行動態 SQL 的推薦方式。看起來您已經在Step 1中這樣做了。

話雖這麼說,關於你的原因的更多背景資訊在這裡很重要。如果您計劃刪除、重命名或更改您目前正在為其創建視圖的基礎表,那麼您的視圖可能不再正常工作,因為視圖只是引用其他對象的查詢的未物化佔位符,並且因此取決於那些對象。請在您的文章中詳細說明您的表格的最終目標是什麼,也許可以對您應該做什麼提出更好的建議。

引用自:https://dba.stackexchange.com/questions/292625