【问题标题】:Inserting into a user-defined table type via a dynamic query in SQL Server?通过 SQL Server 中的动态查询插入用户定义的表类型?
【发布时间】:2021-10-01 15:25:06
【问题描述】:

我有一个用户定义的表类型tyAnalysisNumbers。我需要使用 SELECT 语句在存储过程中填充我的用户定义数据类型,我正在努力让它在我的存储过程中工作。

我尝试过的以下方法不起作用

DECLARE @MyTable tyAnalysisNumbers;

INSERT INTO @MyTable 
    EXEC ('SELECT * FROM ' + @someTable);

我收到此错误:

INSERT EXEC 语句不能嵌套

我不确定如何通过 select 语句插入到我的自定义表中。

谁能帮我完成这个?

【问题讨论】:

  • 这通常应该有效,因此您的脚本中没有包含更多内容。在您的问题中添加一个完整的示例来重现错误。
  • 我有两个存储过程,一个调用一个子进程的父进程。我正在工作的子 sp 使用用户定义的表,按原样工作,你是对的。但它必须从我们应用程序的父存储过程中调用,它有以下几行被触发 - ``` INSERT INTO @resultsTable execute childStoredProcedure Commit Transaction SELECT * FROM @resultsTable End Try Begin Catch If XACT_STATE() 0 ``` 此时错误被记录到 debugEvents,这就是我看到错误 An INSERT EXEC statement cannot be nested 的地方。
  • 什么是@someTable?永久表的名称?在代码前面声明的表变量? TVP?
  • @someTable 是模式和表名,是永久的,不是临时的。
  • 这就是嵌套存储过程的全部功能吗?将某个表的输出插入到表类型中,然后选择它?为什么要打扰表格类型?如果在最终选择之前发生了其他事情,请包含该信息并且不要隐藏它或让它变得愚蠢。解决方案可能是只在动态 SQL 范围内执行所有操作(或者,如果在填充类型后执行的操作集很大和/或 @someTable 可能性的列表很小,则可能有其他解决方案)。

标签: sql sql-server sql-server-2016


【解决方案1】:

INSERT EXEC 语句不能嵌套

上述错误是不言自明的。请看以下场景:

例如,我们有一个插入表格类型数据并返回结果的过程。

CREATE PROCEDURE uspInsertData1
AS 
BEGIN
    DECLARE @MyTable tyAnalysisNumbers;

    INSERT INTO @MyTable 
    EXEC ('SELECT * FROM someTable');

    select * from @MyTable
END

现在,假设我们有另一个过程,它将调用上述过程并再次将数据插入另一个表中。

CREATE PROCEDURE uspInsertData2
AS
BEGIN
    DECLARE @MyTable tyAnalysisNumbers;

    INSERT INTO sometable
    EXEC uspInsertData1
END

现在,如果你执行第一个过程,它会正常工作,但如果你执行第二个过程,你会得到这个错误。

INSERT EXEC 语句不能嵌套。

因为现在您已经嵌套了 EXEC 语句。

如果可能的话,我建议你在单个存储过程中完成你的工作。

【讨论】:

  • 这解释了 OP 的问题,但不是解决方案。
  • @AaronBertrand 同意.. 但我也有这样的场景,但我从不喜欢或建议调用这样的嵌套过程。我总是避免这种嵌套调用以防止这种副作用。我建议在单个存储过程中完成你的工作。
【解决方案2】:

试试这样:

DECLARE @MyTable tyAnalysisNumbers;
SELECT * INTO #Temp FROM @MyTable;

DECLARE @tblName AS SYSNAME = (SELECT name FROM sys.tables WHERE name = @someTable);

EXEC ('INSERT INTO #Temp SELECT * FROM ' + @tblName);

这也解决了 SQL 注入问题。

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多