Sql-Server

有沒有可能在 CTE 範圍內修改數據庫狀態的方法?

  • September 12, 2019

例如:

-- 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;

我認為還有其他方式涉及OPENQUERYor OPENROWSET。但通常除非您專門設置表格以利用這些技巧,否則它不會發生。

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