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