這個問題在這里已經有了答案: 表名作為變數 (10 個回答) 3 天前關閉。
使用 SQL Server
我有使用表名的查詢
Select *
from MyDB..Table1 A inner join MyDB..Table1 B ON A.ID = B.ParentID
SELECT * FROM MyDB..Table1 WHERE No > @X
.
.
.
我必須為 10 多個表運行這些查詢
我不想討論資料庫的架構
但這是現狀
我想要一種方法來使表名可變(如果可能)并在一個地方而不是所有地方更改它
@declare @T as Table = MyDB..Table1
Select *
from @T A inner join @T B ON A.ID = B.ParentID
SELECT * FROM @T WHERE No > @X
.
.
.
uj5u.com熱心網友回復:
您不能在靜態 SQL 中執行此操作,但使用動態 SQL 則很簡單,例如
declare @T as sysname = 'Table1'
declare @sql nvarchar(max) = 'Select * from TableNamePlaceholder A inner join TableNamePlaceholder B ON A.ID = B.ParentID'
set @sql = replace(@sql,'TableNamePlaceholder',quotename(@T))
exec (@sql)
uj5u.com熱心網友回復:
不直接。一種適用于 SELECT 查詢的選項是創建一個視圖:
CREATE VIEW allTables (name, a, b)
AS
SELECT 'Table1' as name, a, b
FROM Table1
UNION ALL
SELECT 'Table2' ..
-- with constant; same as writing SELECT a, b FROM Table2
SELECT a, b
FROM allTables
WHERE name = 'Table2'
-- with variable; without PEO, all tables in QP even if not accessed
SELECT a, b
FROM allTables
WHERE name = @T
-- OPTION (RECOMPILE) -- get PEO, at expense of recompilation
如果應用 PEO 或常量折疊,SQL Server 將完全優化不相關的 UNION ALL 情況,就好像 UNION ALL 分支甚至根本不存在于視圖/查詢中一樣!
即使沒有 PEO,也只會在名稱匹配時查詢表,因為 SQL Server將在執行期間消除“不可訪問”的 UNION ALL 分支。但是,此過濾器在查詢執行期間應用,并且表仍包含在查詢計劃中。(如果所有表都沒有相同的首選索引,有時這會導致奇怪的計劃。)
不幸的是,這種方法對 DML 有限制(例如,視圖是不可更新的),對于 DML,我發現動態 SQL,如另一個答案所示,運行良好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/398735.html
標籤:sql sql-server 查询语句
