Sql-Server
有沒有可能在 CTE 範圍內修改數據庫狀態的方法?
例如:
-- Directly with a DML Statement WITH CTE_DML AS ( UPDATE Table1 SET Column1 = 'Value1' FROM Table1 ) -- Indirectly by executing a procedure WITH CTE_SP AS ( EXEC sp_ProcedureThatModifiesTheDatabaseState ) -- Some kind of cross applied function WITH CTE_FN AS ( SELECT Table1.Column1 FROM Table1 CROSS APPLY fn_FunctionThatModifiesTheDatabaseState(Table1.Column2) )
我知道這些都不是有效的(坦率地說,客觀上是愚蠢的——尤其是函式),但這是我的問題。我只知道一個子集,在 CTE 範圍內修改數據庫狀態時這是不可能的。有沒有辦法在 CTE 範圍內修改數據庫狀態,例如表?
實際上,沒有。
從技術上講,是的,但是您必須非常努力並且安全性非常差。例如(未經測試,僅出於一般想法):
CREATE FUNCTION dbo.BadIdea() RETURNS int AS BEGIN DECLARE @sql nvarchar(max); SET @sql = 'osql -S' +@@servername +' -E -q "UPDATE db.dbo.table... ;"'; EXEC master.sys.xp_cmdshell @sql; RETURN 1; END GO ;WITH badIdeaCTE AS ( SELECT x = dbo.BadIdea() FROM sys.all_objects ) SELECT x FROM badIdeaCTE;
我認為還有其他方式涉及
OPENQUERY
orOPENROWSET
。但通常除非您專門設置表格以利用這些技巧,否則它不會發生。