【发布时间】:2017-08-04 17:32:33
【问题描述】:
我有一个表值函数,其中一些参数可以为空,而其他参数定义了该函数将使用的一些表和列名称。不幸的是,这意味着需要动态 SQL。当我在 SSMS 中使用时,查询运行完美,但尝试将其转换为函数会导致
消息 443,级别 16,状态 14,过程事件,第 67 行 [批处理开始第 0 行] 在函数中无效使用副作用运算符“INSERT EXEC”。
该函数用于获取事件的名称,该名称将构成事件的数据源,以及事件表的键列"e.'+@eventType+'ID" 和'e.'+@eventType+'Number'
该函数将根据返回生成一个报告,并在另一个过程中加入以生成另一个报告。
我环顾四周,但大多数示例和类似问题根本不适用,通常是希望修改数据库中的表,而不是表变量,或者不希望插入返回表变量。有没有办法绕过这个限制,无论是使用临时表还是在动态 sql 中插入?
IF (@childEvent IS NOT NULL) BEGIN
SET @SQL = ' SELECT e.ProductID, e.ProductName, e.'+@eventType+'Number, e.Quantity - ISNULL(c.Quantity,0) AS Quantity '
+' FROM {schema}.'+@eventType+'Table e '
+' LEFT OUTER JOIN {schema}.'+@childEvent+'Table c '
+' ON c.'+@eventType+'ID = e.'+@eventType+'ID '
END
INSERT INTO @Events
EXECUTE sp_executesql @SQL, N'@asOfDate Date',@asOfDate
【问题讨论】:
-
使用存储过程或 CLR 表值函数。不能在表值函数中执行动态 SQL。
标签: sql sql-server ssms