如何在不使用存储过程的情况下在表函数中返回值 exec?

Posted

技术标签:

【中文标题】如何在不使用存储过程的情况下在表函数中返回值 exec?【英文标题】:How return value exec in table function without using a stored procedure? 【发布时间】:2017-07-29 11:06:31 【问题描述】:

我想要返回表函数但错误是

在函数中无效使用副作用运算符“INSERT EXEC”。

我的代码:

CREATE FUNCTION [dbo].[Fn_GetTable] 
     (@ID AS NVARCHAR(MAX))
RETURNS 
      @Tbl TABLE (ID NVARCHAR(MAX)) 
AS
BEGIN
    DECLARE @str AS NVARCHAR(MAX)

    SET @str = 'SELECT * FROM support WHERE support IN ('+@ID+')'

    INSERT INTO @Tbl (ID)
        EXEC sp_executesql @str

    RETURN 
END

【问题讨论】:

【参考方案1】:

在 UDF 中禁止包含 sp_executesql 的过程。 https://docs.microsoft.com/en-us/sql/relational-databases/user-defined-functions/create-user-defined-functions-database-engine

我不明白为什么你需要动态。试试

Create FUNCTION [dbo].[Fn_GetTable] (
 @ID as nvarchar(MAX)
)
RETURNS 
@Tbl TABLE (
 ID nvarchar(MAX)
) AS
BEGIN

    INSERT INTO  @Tbl (ID)
    select * 
    from support  
    where support in (@ID)

RETURN 
END

如果参数应该代表一个列表,您最好使用 UDT。 https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration-database-objects-user-defined-types/working-with-user-defined-types-in-sql-server 。演示

CREATE TYPE dbo.UDT_IDS AS TABLE (ID  NVARCHAR(MAX)) ;

并将其用作参数

CREATE FUNCTION [dbo].[Fn_GetTable] (
 @IDS as dbo.UDT_IDS READONLY
)
RETURNS 
@Tbl TABLE (
 ID NVARCHAR(MAX)
) AS
BEGIN

    INSERT INTO  @Tbl (ID)
    SELECT support 
    FROM support  
    WHERE support in (SELECT ID FROM @IDS)

RETURN 
END

【讨论】:

可能参数包含逗号分隔的字符串,在这种情况下,这将无法正常工作。 @MartinSmith UDT 表是将列表作为参数传递的正确工具。

以上是关于如何在不使用存储过程的情况下在表函数中返回值 exec?的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 boost::promise 的情况下在 boost 线程中返回值

如何在不使用全局变量的情况下在 bash 中返回一个数组?

如何在不自动舍入的情况下在 SQL Server 中返回具有两位小数的数字

在函数中,如何在不使用 ref 游标的情况下返回多个值?

如何在不插入值的情况下在sql中创建动态行?

如何在不硬编码存储库的情况下在 Maven 中部署其他工件?