【问题标题】:Nested user-defined functions in tsql. Parameters passing trough INSERT-SELECT structuressql中的嵌套用户定义函数。通过 INSERT-SELECT 结构传递的参数
【发布时间】:2014-08-25 16:05:25
【问题描述】:

我有两个 SQLServer2008 用户定义函数:fn_Top 和 fn_Nested。 第一个 fn_Top 的结构是这样的:

 CREATE FUNCTION [dbo].[fn_Top]
      RETURNS @Results table (
                        MyField1 nvarchar(2000),
                        MyField2 nvarchar(2000)
                       )
        AS    
        BEGIN  
        INSERT INTO 
                    @Results 
                    (
                    MyField1,
                    MyField2 
                    )
                    SELECT 
                        item,  
                        (SELECT MyString FROM dbo.fn_Nested(x.MyCounter))
                    FROM 
                    OtherTable x
       RETURN      
       END

我想执行一种动态参数传递给第二个函数 fn_Nested,读取表 OtherTable 中数字字段 MyCounter 的值。

事实是,x.MyCounter 未被识别为有效值。 另一方面,如果我在 fn_Nested 中设置一个静态参数,即 IE dbo.fn_Nested(17),则一切正常。

有没有人可以提出解决此问题的解决方法? 提前致谢。

【问题讨论】:

  • dbo.fn_Nested() 返回什么?
  • 或者,更清楚地说,dbo.fn_Nested 是标量函数还是表值函数?

标签: sql-server tsql sql-server-2008-r2 parameter-passing user-defined-functions


【解决方案1】:

假设fn_Nested 是一个表值函数,您的语法很好(尽管可以简化)。 该错误似乎表明OtherTable 没有名为MyCounter 的列,或者它不是可以隐式转换为数值的列类型。 确切的错误是什么?

顺便说一句,您可以通过将fn_Top 编写为内联表值函数来简化它:

CREATE FUNCTION dbo.fn_Top()
RETURNS TABLE
AS
RETURN 
(  
        SELECT x,item as MyField1, y.MyString AS MyField2
          FROM dbo.OtherTable x
   CROSS APPLY dbo.fn_Nested(x.MyCounter) AS y
)
GO

【讨论】:

    【解决方案2】:

    这里描述了使用第二个函数的语法

    SQL User Defined Function Within Select

    create table OtherTable (
    item varchar(10),
    MyCounter int
    );
    
    CREATE FUNCTION fn_Nested(@Id int)
    RETURNS varchar(20)
    AS
    BEGIN
       RETURN 'testString ' + CAST(@Id AS VARCHAR(3))
    END;
    
    INSERT INTO OtherTable SELECT 'item1', 1
    INSERT INTO OtherTable SELECT 'item2', 2
    
    SELECT item,
    dbo.fn_Nested(x.MyCounter) as MyString
    FROM OtherTable x
    

    结果:

    item1 testString 1

    item2 testString 2

    【讨论】:

      猜你喜欢
      • 2013-02-27
      • 2018-11-03
      • 1970-01-01
      • 2021-09-16
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 2014-02-27
      相关资源
      最近更新 更多