SQL Server:表值函数不适用于子查询

Posted

技术标签:

【中文标题】SQL Server:表值函数不适用于子查询【英文标题】:SQL Server : table-valued function does not work with sub query 【发布时间】:2012-08-08 11:57:35 【问题描述】:

我有一个由我创建的 SQL Server 表值函数,我在下面粘贴了创建脚本

CREATE FUNCTION [dbo].[getTableFromString]
(       
    @String AS nvarchar(max)

)
RETURNS @ReturnTable TABLE ( StringValues nvarchar(10)  )   
AS begin 

    if (SELECT CHARINDEX(',', @String)) = 0
        begin
                insert into @ReturnTable (StringValues) values (subString(@String,1,len(@String)));
        end 
    else
        begin 
            while (SELECT CHARINDEX(',', @String)) > 0
            begin 
                insert into @ReturnTable (StringValues) values (subString(@String,1,CHARINDEX(',', @String)-1));
                set @String  = subString(@String,CHARINDEX(',', @String)+1,len(@String));

                if (SELECT CHARINDEX(',', @String)) = 0
                begin
                        insert into @ReturnTable (StringValues) values (subString(@String,1,len(@String)));
                end         
            end 
        end

    return ;
end

我正在使用这个功能,如下所示

Select sum(NetSales)
from vwxsalesall
where Company = 'rs'
and storecode = (select cPrimaryStockRoomCode from CompanyMaster.CompanyProfileDetail where cCompanyNo = 'rs' and cSecondaryStockRoomCode = 'R01B')
and trandate >= '2012-01-01'
and trandate <= '2012-01-31'
and ( 
        brand in (  
                    select StringValues from  dbo.getTableFromString(
                                                                    select vIncludedBrandCodes
                                                                    from StockRoomTargetData.MonthlyTarget 
                                                                    where cCompanyNo = 'rs' 
                                                                    and cSecondaryStockRoomCode = 'R01B'
                                                                    and nYear = 2012 
                                                                    and nMonth = 8
                                                                    )  
                 ) 
    )

不幸的是我收到了这个错误

消息 156,第 15 级,状态 1,第 10 行 关键字“select”附近的语法不正确。 消息 102,第 15 级,状态 1,第 16 行 ')' 附近的语法不正确。

请帮帮我

【问题讨论】:

您需要将select vIncludedBrandCodes ... 子查询放在括号中,以向Sql Server 表明这实际上是一个子查询。 你能解释一下吗? 请看我的回答。 【参考方案1】:

例如,您需要在子查询周围添加另一组括号

select StringValues from  dbo.getTableFromString((  your-subquery ))

                                                 ^                  ^
                                                 (parenthesis added)

第一组括号在语法上属于 TVF 调用,第二组表示子查询。

现在您的查询:

Select sum(NetSales)
from vwxsalesall
where Company = 'rs'
and storecode = (select cPrimaryStockRoomCode from CompanyMaster.CompanyProfileDetail where cCompanyNo = 'rs' and cSecondaryStockRoomCode = 'R01B')
and trandate >= '2012-01-01'
and trandate <= '2012-01-31'
and ( 
        brand in (  
                    select StringValues from  dbo.getTableFromString((
                                                                    select vIncludedBrandCodes
                                                                    from StockRoomTargetData.MonthlyTarget 
                                                                    where cCompanyNo = 'rs' 
                                                                    and cSecondaryStockRoomCode = 'R01B'
                                                                    and nYear = 2012 
                                                                    and nMonth = 8
                                                                    )) 
                 ) 
    )

【讨论】:

Msg 102, Level 15, State 1, Line 10 '(' 附近的语法不正确。Msg 102, Level 15, State 1, Line 17 ')' 附近的语法不正确。 @Prabhakantha 它对我有用,see it yourself。您使用的是哪个版本的 Sql Server? @Prabhakantha 如果您当前的查询仍然无法正常工作,您能否发布一下? 我正在使用兼容级别为 80 的 sql 2005,我无法更改数据库中的兼容级别,因为某些报告进入了不工作状态:'( @Nicola 我刚刚粘贴了您的查询,因为您使用的是相同的表名,它应该对我有用:)

以上是关于SQL Server:表值函数不适用于子查询的主要内容,如果未能解决你的问题,请参考以下文章

查看 vs 表值函数 vs 子查询

SQLserver 怎么把查出的字符串结果作为子查询条件

使用 SQL Server 将子查询结果重用于其他计算

为啥 SQL Server 表值函数插入需要很长时间?

为啥排序规则不适用于子查询中的 xml 路径?

EXISTS 不适用于 WITH 子句中的子查询